|
@@ -151,116 +151,10 @@ public class ProductHoldingControl : DynamicDataGrid<StockHolding>, IProductCont
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- private bool RecalculateHoldings(Button arg1, CoreRow[] arg2)
|
|
|
+ private bool RecalculateHoldings(Button arg1, CoreRow[] arg2)
|
|
|
{
|
|
|
- Dictionary<String, int> messages = new();
|
|
|
- void AddMessage(String type)
|
|
|
- {
|
|
|
- messages.TryGetValue(type, out int count);
|
|
|
- messages[type] = ++count;
|
|
|
- }
|
|
|
-
|
|
|
- Progress.ShowModal("Recalculating", progress =>
|
|
|
- {
|
|
|
- progress.Report("Loading Data");
|
|
|
- MultiQuery query = new MultiQuery();
|
|
|
-
|
|
|
- query.Add(
|
|
|
- new Filter<StockHolding>(x => x.Product.ID).IsEqualTo(Product.ID),
|
|
|
- Columns.Required<StockHolding>().Add(x => x.ID)
|
|
|
- .Add(x => x.Product.ID)
|
|
|
- .Add(x => x.Job.ID)
|
|
|
- .Add(x => x.Style.ID)
|
|
|
- .AddDimensionsColumns(x => x.Dimensions, Dimensions.ColumnsType.Local)
|
|
|
- .Add(x => x.Units)
|
|
|
- .Add(x => x.AverageValue)
|
|
|
- .Add(x => x.Available)
|
|
|
- .Add(x => x.Qty)
|
|
|
- .Add(x => x.Weight)
|
|
|
- .Add(x => x.Value)
|
|
|
- );
|
|
|
-
|
|
|
- query.Add(
|
|
|
- new Filter<StockMovement>(x => x.Product.ID).IsEqualTo(Product.ID),
|
|
|
- Columns.None<StockMovement>().Add(x => x.ID)
|
|
|
- .Add(x => x.Product.ID)
|
|
|
- .Add(x => x.Job.ID)
|
|
|
- .Add(x => x.Style.ID)
|
|
|
- .AddDimensionsColumns(x => x.Dimensions, Dimensions.ColumnsType.Local)
|
|
|
- .Add(x => x.Units)
|
|
|
- .Add(x => x.Cost)
|
|
|
- .Add(x => x.JobRequisitionItem.ID)
|
|
|
- );
|
|
|
- query.Query();
|
|
|
- var holdings = query.Get<StockHolding>().ToObjects<StockHolding>().ToList();
|
|
|
- var toDelete = new List<StockHolding>();
|
|
|
- var movements = query.Get<StockMovement>().ToObjects<StockMovement>().ToList();
|
|
|
-
|
|
|
- progress.Report("Processing");
|
|
|
- var updates = new List<StockHolding>();
|
|
|
-
|
|
|
- while (movements.Any())
|
|
|
- {
|
|
|
- var first = movements.First();
|
|
|
- var selected = movements.Where(x => x.IsEqualTo(first)).ToList();
|
|
|
-
|
|
|
- var holding = holdings.FirstOrDefault(x => x.IsEqualTo(first));
|
|
|
- if (holding == null)
|
|
|
- {
|
|
|
- holding = new StockHolding();
|
|
|
- holding.Location.ID = first.Location.ID;
|
|
|
- holding.Product.ID = Product.ID;
|
|
|
- holding.Style.ID = first.Style.ID;
|
|
|
- holding.Job.ID = first.Job.ID;
|
|
|
- holding.Dimensions.CopyFrom(first.Dimensions);
|
|
|
- }
|
|
|
- holding.Recalculate(selected);
|
|
|
-
|
|
|
- // Removing from the list so that it is not deleted.
|
|
|
- if (holdings.Contains(holding))
|
|
|
- holdings.Remove(holding);
|
|
|
-
|
|
|
- if (holding.Units.IsEffectivelyEqual(0.0) && holding.Available.IsEffectivelyEqual(0.0))
|
|
|
- {
|
|
|
- if(holding.ID != Guid.Empty)
|
|
|
- {
|
|
|
- toDelete.Add(holding);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (holding.IsChanged())
|
|
|
- {
|
|
|
- AddMessage(holding.ID != Guid.Empty ? "updated" : "added");
|
|
|
- updates.Add(holding);
|
|
|
- }
|
|
|
-
|
|
|
- movements.RemoveAll(x => selected.Any(s => s.ID == x.ID));
|
|
|
- }
|
|
|
-
|
|
|
- toDelete.AddRange(holdings);
|
|
|
- foreach (var holding in toDelete)
|
|
|
- AddMessage("deleted");
|
|
|
-
|
|
|
- if (updates.Any())
|
|
|
- {
|
|
|
- progress.Report($"Updating {updates.Count} Holdings");
|
|
|
- new Client<StockHolding>().Save(updates.Where(x => x.IsChanged()), "Updated by Recalculation");
|
|
|
- }
|
|
|
-
|
|
|
- if (toDelete.Any())
|
|
|
- {
|
|
|
- progress.Report($"Deleting {toDelete.Count} Holdings");
|
|
|
- new Client<StockHolding>().Delete(toDelete, "Removed by Recalculation");
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
- MessageWindow.ShowMessage(
|
|
|
- messages.Any()
|
|
|
- ? String.Join("\n", messages.Select(x => $"{x.Value} holdings {x.Key}"))
|
|
|
- : "Nothing to Update!"
|
|
|
- ,"Recalculate");
|
|
|
- return true;
|
|
|
+ var result = StockUtils.RecalculateHoldingsOfProducts([Product.ID], out var messages);
|
|
|
+ MessageWindow.ShowMessage(string.Join("\n", messages), "Recalculate");
|
|
|
+ return result;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|