فهرست منبع

Fixed NextStockTakeDate calculations
Added RecordCount to StockLocationGrid, and made StockLocationPanel a proper SplitPanel
Implemented Upgrade Script to rebuild StockLocation StockTake Dates

frogsoftware 1 سال پیش
والد
کامیت
b269f18039

+ 10 - 7
prs.classes/Entities/Stock/StockLocation/StockLocation.cs

@@ -120,15 +120,18 @@ namespace Comal.Classes
 
         private static DateTime CalculateNextStockTake(DateTime last, StockTakeFrequency frequency)
         {
+
+            DateTime CheckDate(DateTime date, Func<DateTime> action) => date.IsEmpty() ? DateTime.Today : action();
+            
             return frequency switch
             {
-                StockTakeFrequency.Daily => last.AddDays(1),
-                StockTakeFrequency.Weekly => last.AddDays(7),
-                StockTakeFrequency.Fortnightly => last.AddDays(14),
-                StockTakeFrequency.Monthly => last.AddMonths(1),
-                StockTakeFrequency.Quarterly => last.AddMonths(3),
-                StockTakeFrequency.TwiceYearly => last.AddMonths(6),
-                StockTakeFrequency.Yearly => last.AddYears(1),
+                StockTakeFrequency.Daily => CheckDate(last,() => last.AddDays(1)),
+                StockTakeFrequency.Weekly => CheckDate(last,() => last.AddDays(1)),
+                StockTakeFrequency.Fortnightly => CheckDate(last,() => last.AddDays(1)),
+                StockTakeFrequency.Monthly => CheckDate(last,() => last.AddMonths(1)),
+                StockTakeFrequency.Quarterly => CheckDate(last,() => last.AddMonths(3)),
+                StockTakeFrequency.TwiceYearly => CheckDate(last,() => last.AddMonths(6)),
+                StockTakeFrequency.Yearly => CheckDate(last,() => last.AddYears(1)),
                 _ => DateTime.MinValue
             };
         }

+ 2 - 1
prs.desktop/Panels/Products/Locations/StockLocationGrid.cs

@@ -74,7 +74,8 @@ public class StockLocationGrid : DynamicDataGrid<StockLocation>
         options.AddRange(
             DynamicGridOption.MultiSelect,
             DynamicGridOption.FilterRows,
-            DynamicGridOption.SelectColumns
+            DynamicGridOption.SelectColumns,
+            DynamicGridOption.RecordCount
         );
     }
 

+ 1 - 1
prs.desktop/Panels/Products/Locations/StockLocationPanel.xaml

@@ -7,7 +7,7 @@
              xmlns:dynamic="clr-namespace:InABox.DynamicGrid;assembly=InABox.Wpf"
              mc:Ignorable="d"
              d:DesignHeight="450" d:DesignWidth="800">
-    <dynamic:DynamicSplitPanel MasterCaption="Stock Location List" DetailCaption="Location Summary" AnchorWidth="500" AllowableViews="Combined"
+    <dynamic:DynamicSplitPanel MasterCaption="Stock Location List" DetailCaption="Location Summary" AnchorWidth="500" AllowableViews="Master,Combined"
                                View="Combined" DetailHeight="400">
         <dynamic:DynamicSplitPanel.Header>
             <Border CornerRadius="5,5,0,0" BorderBrush="Gray" BorderThickness="0.75" DockPanel.Dock="Top"

+ 1 - 0
prs.shared/Database Update Scripts/DatabaseUpdateScripts.cs

@@ -46,5 +46,6 @@ public static class DatabaseUpdateScripts
         DataUpdater.RegisterUpdateScript<Update_7_56>();
         DataUpdater.RegisterUpdateScript<Update_7_62>();
         DataUpdater.RegisterUpdateScript<Update_7_63>();
+        DataUpdater.RegisterUpdateScript<Update_7_66>();
     }
 }

+ 85 - 0
prs.shared/Database Update Scripts/Update_7_66.cs

@@ -0,0 +1,85 @@
+using Comal.Classes;
+using InABox.Core;
+using InABox.Database;
+
+namespace PRS.Shared.Database_Update_Scripts;
+
+public class Update_7_66 : DatabaseUpdateScript
+{
+    public override VersionNumber Version => new VersionNumber(7, 66);
+
+    public override bool Update()
+    {
+        Logger.Send(LogType.Information, "", $"Updating Stocktake History");
+
+        var _holdings = DbFactory.Provider.Query(
+            new Filter<StockHolding>().All(),
+            new Columns<StockHolding>(x => x.ID)
+                .Add(x => x.Location.ID)
+                .Add(x => x.LastStockTake)
+            ).ToObjects<StockHolding>()
+                .GroupBy(x=>x.Location.ID).ToArray();
+
+        var _locations = DbFactory.Provider.Query(
+            new Filter<StockLocation>().All(),
+            new Columns<StockLocation>(x => x.ID)
+                .Add(x => x.LastStocktake)
+                .Add(x => x.CurrentStocktake)
+                .Add(x => x.StocktakeFrequency)
+                .Add(x => x.NextStocktake)
+        ).ToArray<StockLocation>();
+        
+        List<StockLocation> _updates = new List<StockLocation>();
+        int _updateCount = 0;
+        foreach (var _location in _locations)
+        {
+            
+            var _group = _holdings.FirstOrDefault(x => x.Key == _location.ID);
+            if (_group != null)
+            {
+                if (_group.Any(x => x.LastStockTake.IsEmpty()))
+                {
+                    _location.CurrentStocktake =
+                        _group.Where(x => !x.LastStockTake.IsEmpty())
+                            .MinBy(x => x.LastStockTake)?
+                            .LastStockTake
+                        ?? DateTime.MinValue;
+                    _location.LastStocktake = DateTime.MinValue;
+                }
+                else
+                {
+                    _location.CurrentStocktake = DateTime.MinValue;
+                    _location.LastStocktake =
+                        _group.MaxBy(x => x.LastStockTake)?
+                            .LastStockTake
+                        ?? DateTime.MinValue;
+                }
+            }
+            else
+            {
+                _location.CurrentStocktake = DateTime.MinValue;
+                _location.LastStocktake = DateTime.MinValue;
+            }
+            
+            _location.StocktakeFrequency = StockTakeFrequency.Yearly;
+
+            _updates.Add(_location);
+            if (_updates.Count >= 500)
+            {
+                _updateCount += 500;
+                Logger.Send(LogType.Information, "", $"- Saving {_updateCount} Locations");
+                DbFactory.Provider.Save(_updates);
+                _updates.Clear();
+            }
+        }
+        
+        if (_updates.Any())
+        {
+            _updateCount += _updates.Count;
+            Logger.Send(LogType.Information, "", $"- Saving {_updateCount} Locations");
+            DbFactory.Provider.Save(_updates);
+        }
+        
+        return true;
+    }
+}