|
@@ -12,177 +12,177 @@ using InABox.Wpf;
|
|
|
using InABox.WPF;
|
|
|
using net.sf.mpxj.MpxjUtilities;
|
|
|
|
|
|
-namespace PRSDesktop.Panels.Jobs
|
|
|
+namespace PRSDesktop.Panels.Jobs;
|
|
|
+
|
|
|
+public class JobStockGrid : DynamicDataGrid<StockHolding>, IMasterDetailControl<Job,StockHolding>, IBasePanel
|
|
|
{
|
|
|
- public class JobStockGrid : DynamicDataGrid<StockHolding>, IMasterDetailControl<Job,StockHolding>, IBasePanel
|
|
|
+ public Job? Master
|
|
|
{
|
|
|
- public Job? Master
|
|
|
+ get => _master;
|
|
|
+ set
|
|
|
{
|
|
|
- get => _master;
|
|
|
- set
|
|
|
- {
|
|
|
- _master = value;
|
|
|
- _releaseStock.IsEnabled = value?.JobStatus.Active == false && SelectedRows?.Any() == true;
|
|
|
- }
|
|
|
+ _master = value;
|
|
|
+ _releaseStock.IsEnabled = value?.JobStatus.Active == false && SelectedRows?.Any() == true;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- private Button _releaseStock;
|
|
|
- private Job? _master;
|
|
|
+ private Button _releaseStock;
|
|
|
+ private Job? _master;
|
|
|
|
|
|
- public JobStockGrid()
|
|
|
- {
|
|
|
- _releaseStock = AddButton("Release Stock", PRSDesktop.Resources.archive.AsBitmapImage(), ReleaseStock);
|
|
|
- HiddenColumns.Add(x => x.Location.ID);
|
|
|
- HiddenColumns.Add(x => x.Product.ID);
|
|
|
- HiddenColumns.Add(x => x.Style.ID);
|
|
|
- HiddenColumns.Add(x=>x.Dimensions.Unit.ID);
|
|
|
- HiddenColumns.Add(x=>x.Dimensions.Height);
|
|
|
- HiddenColumns.Add(x=>x.Dimensions.Length);
|
|
|
- HiddenColumns.Add(x=>x.Dimensions.Width);
|
|
|
- HiddenColumns.Add(x=>x.Dimensions.Quantity);
|
|
|
- HiddenColumns.Add(x=>x.Dimensions.Weight);
|
|
|
- HiddenColumns.Add(x => x.Job.ID);
|
|
|
- }
|
|
|
+ public JobStockGrid()
|
|
|
+ {
|
|
|
+ _releaseStock = AddButton("Release Stock", PRSDesktop.Resources.archive.AsBitmapImage(), ReleaseStock);
|
|
|
+ HiddenColumns.Add(x => x.Location.ID);
|
|
|
+ HiddenColumns.Add(x => x.Product.ID);
|
|
|
+ HiddenColumns.Add(x => x.Style.ID);
|
|
|
+ HiddenColumns.Add(x=>x.Dimensions.Unit.ID);
|
|
|
+ HiddenColumns.Add(x=>x.Dimensions.Height);
|
|
|
+ HiddenColumns.Add(x=>x.Dimensions.Length);
|
|
|
+ HiddenColumns.Add(x=>x.Dimensions.Width);
|
|
|
+ HiddenColumns.Add(x=>x.Dimensions.Quantity);
|
|
|
+ HiddenColumns.Add(x=>x.Dimensions.Weight);
|
|
|
+ HiddenColumns.Add(x => x.Job.ID);
|
|
|
+ }
|
|
|
|
|
|
- protected override void Init()
|
|
|
- {
|
|
|
- base.Init();
|
|
|
- }
|
|
|
+ protected override void Init()
|
|
|
+ {
|
|
|
+ base.Init();
|
|
|
+ }
|
|
|
|
|
|
- protected override void SelectItems(CoreRow[]? rows)
|
|
|
- {
|
|
|
- base.SelectItems(rows);
|
|
|
- _releaseStock.IsEnabled = Master?.JobStatus.Active == false && SelectedRows?.Any() == true;
|
|
|
- }
|
|
|
+ protected override void SelectItems(CoreRow[]? rows)
|
|
|
+ {
|
|
|
+ base.SelectItems(rows);
|
|
|
+ _releaseStock.IsEnabled = Master?.JobStatus.Active == false && SelectedRows?.Any() == true;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- private bool ReleaseStock(object sender, CoreRow[] rows)
|
|
|
+ private bool ReleaseStock(object sender, CoreRow[] rows)
|
|
|
+ {
|
|
|
+ if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will release the selected holdings from this job.", "Confirm") != MessageWindowResult.Yes)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ var toSave = new List<StockMovement>();
|
|
|
+ foreach (var row in SelectedRows)
|
|
|
{
|
|
|
- if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will release the selected holdings from this job.", "Confirm") != MessageWindowResult.Yes)
|
|
|
- return false;
|
|
|
+ StockHolding holding = row.ToObject<StockHolding>();
|
|
|
+ var movements = new Client<StockMovement>().Query(
|
|
|
+ StockHolding.GetFilter(holding),
|
|
|
+ new Columns<StockMovement>(x => x.Units)
|
|
|
+ .Add(x => x.Location.ID)
|
|
|
+ .Add(x => x.Product.ID)
|
|
|
+ .Add(x => x.Style.ID)
|
|
|
+ .AddDimensionsColumns(x => x.Dimensions)
|
|
|
+ .Add(x => x.Cost)
|
|
|
+ .Add(x => x.OrderItem.ID)
|
|
|
+ .Add(x => x.JobRequisitionItem.ID))
|
|
|
+ .ToObjects<StockMovement>()
|
|
|
+ .GroupBy(x => new
|
|
|
+ {
|
|
|
+ Location = x.Location.ID,
|
|
|
+ Product = x.Product.ID,
|
|
|
+ Style = x.Style.ID,
|
|
|
+ x.Dimensions,
|
|
|
+ x.Cost,
|
|
|
+ OrderItem = x.OrderItem.ID,
|
|
|
+ JobRequisitionItem = x.JobRequisitionItem.ID
|
|
|
+ })
|
|
|
+ .Select(x => new
|
|
|
+ {
|
|
|
+ x.Key,
|
|
|
+ Units = x.Sum(x => x.Units)
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
- var toSave = new List<StockMovement>();
|
|
|
- foreach (var row in SelectedRows)
|
|
|
+ foreach (var group in movements)
|
|
|
{
|
|
|
- StockHolding holding = row.ToObject<StockHolding>();
|
|
|
- var movements = new Client<StockMovement>().Query(
|
|
|
- StockHolding.GetFilter(holding),
|
|
|
- new Columns<StockMovement>(x => x.Units)
|
|
|
- .Add(x => x.Location.ID)
|
|
|
- .Add(x => x.Product.ID)
|
|
|
- .Add(x => x.Style.ID)
|
|
|
- .AddDimensionsColumns(x => x.Dimensions)
|
|
|
- .Add(x => x.Cost)
|
|
|
- .Add(x => x.OrderItem.ID)
|
|
|
- .Add(x => x.JobRequisitionItem.ID))
|
|
|
- .ToObjects<StockMovement>()
|
|
|
- .GroupBy(x => new
|
|
|
- {
|
|
|
- Location = x.Location.ID,
|
|
|
- Product = x.Product.ID,
|
|
|
- Style = x.Style.ID,
|
|
|
- x.Dimensions,
|
|
|
- x.Cost,
|
|
|
- OrderItem = x.OrderItem.ID,
|
|
|
- JobRequisitionItem = x.JobRequisitionItem.ID
|
|
|
- })
|
|
|
- .Select(x => new
|
|
|
- {
|
|
|
- x.Key,
|
|
|
- Units = x.Sum(x => x.Units)
|
|
|
- }
|
|
|
- );
|
|
|
-
|
|
|
- foreach (var group in movements)
|
|
|
- {
|
|
|
|
|
|
- var from = holding.CreateMovement();
|
|
|
- from.OrderItem.ID = group.Key.OrderItem;
|
|
|
- from.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
|
|
|
- from.Cost = group.Key.Cost;
|
|
|
- from.Type = StockMovementType.TransferOut;
|
|
|
- from.Job.ID = Master.ID;
|
|
|
- from.Issued = group.Units;
|
|
|
-
|
|
|
- var to = holding.CreateMovement();
|
|
|
- to.Cost = group.Key.Cost;
|
|
|
- to.OrderItem.ID = group.Key.OrderItem;
|
|
|
- to.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
|
|
|
- to.Type = StockMovementType.TransferIn;
|
|
|
- to.Transaction = from.Transaction;
|
|
|
- to.Units = group.Units;
|
|
|
-
|
|
|
- toSave.Add(from);
|
|
|
- toSave.Add(to);
|
|
|
- }
|
|
|
+ var from = holding.CreateMovement();
|
|
|
+ from.OrderItem.ID = group.Key.OrderItem;
|
|
|
+ from.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
|
|
|
+ from.Cost = group.Key.Cost;
|
|
|
+ from.Type = StockMovementType.TransferOut;
|
|
|
+ from.Job.ID = Master.ID;
|
|
|
+ from.Issued = group.Units;
|
|
|
+
|
|
|
+ var to = holding.CreateMovement();
|
|
|
+ to.Cost = group.Key.Cost;
|
|
|
+ to.OrderItem.ID = group.Key.OrderItem;
|
|
|
+ to.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
|
|
|
+ to.Type = StockMovementType.TransferIn;
|
|
|
+ to.Transaction = from.Transaction;
|
|
|
+ to.Units = group.Units;
|
|
|
+ to.Notes = $"Released from job {Master.JobNumber}";
|
|
|
+
|
|
|
+ toSave.Add(from);
|
|
|
+ toSave.Add(to);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- new Client<StockMovement>().Save(toSave, "Released job stock.");
|
|
|
- Refresh(false,true);
|
|
|
- MessageWindow.ShowMessage("All job stock reserves released.", "Success");
|
|
|
+ Client.Save(toSave, $"Stock Released from {Master.JobNumber}");
|
|
|
+ Refresh(false,true);
|
|
|
+ MessageWindow.ShowMessage("All job stock reserves released.", "Success");
|
|
|
|
|
|
- return true;
|
|
|
- }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
- public Filter<StockHolding> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
|
|
|
- ? new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master.ID)
|
|
|
- : new Filter<StockHolding>().None();
|
|
|
-
|
|
|
- protected override void DoReconfigure(FluentList<DynamicGridOption> options)
|
|
|
- {
|
|
|
- base.DoReconfigure(options);
|
|
|
- options
|
|
|
- .BeginUpdate()
|
|
|
- .Clear()
|
|
|
- .Add(DynamicGridOption.FilterRows)
|
|
|
- .Add(DynamicGridOption.RecordCount)
|
|
|
- .Add(DynamicGridOption.SelectColumns)
|
|
|
- .Add(DynamicGridOption.ExportData)
|
|
|
- .EndUpdate();
|
|
|
- }
|
|
|
-
|
|
|
- protected override void Reload(Filters<StockHolding> criteria, Columns<StockHolding> columns, ref SortOrder<StockHolding>? sort, Action<CoreTable?, Exception?> action)
|
|
|
- {
|
|
|
- criteria.Add(MasterDetailFilter);
|
|
|
- base.Reload(criteria, columns, ref sort, action);
|
|
|
- }
|
|
|
+ public Filter<StockHolding> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
|
|
|
+ ? new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master.ID)
|
|
|
+ : new Filter<StockHolding>().None();
|
|
|
+
|
|
|
+ protected override void DoReconfigure(FluentList<DynamicGridOption> options)
|
|
|
+ {
|
|
|
+ base.DoReconfigure(options);
|
|
|
+ options
|
|
|
+ .BeginUpdate()
|
|
|
+ .Clear()
|
|
|
+ .Add(DynamicGridOption.FilterRows)
|
|
|
+ .Add(DynamicGridOption.RecordCount)
|
|
|
+ .Add(DynamicGridOption.SelectColumns)
|
|
|
+ .Add(DynamicGridOption.ExportData)
|
|
|
+ .EndUpdate();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override void Reload(Filters<StockHolding> criteria, Columns<StockHolding> columns, ref SortOrder<StockHolding>? sort, Action<CoreTable?, Exception?> action)
|
|
|
+ {
|
|
|
+ criteria.Add(MasterDetailFilter);
|
|
|
+ base.Reload(criteria, columns, ref sort, action);
|
|
|
+ }
|
|
|
|
|
|
- public void Setup()
|
|
|
- {
|
|
|
- Refresh(true,false);
|
|
|
- }
|
|
|
+ public void Setup()
|
|
|
+ {
|
|
|
+ Refresh(true,false);
|
|
|
+ }
|
|
|
|
|
|
- public void Shutdown(CancelEventArgs? cancel)
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
+ public void Shutdown(CancelEventArgs? cancel)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- public void Refresh()
|
|
|
- {
|
|
|
- Refresh(false,true);
|
|
|
- }
|
|
|
+ public void Refresh()
|
|
|
+ {
|
|
|
+ Refresh(false,true);
|
|
|
+ }
|
|
|
|
|
|
- public string SectionName => "Stock Holdings";
|
|
|
- public DataModel DataModel(Selection selection)
|
|
|
- {
|
|
|
- return new AutoDataModel<StockHolding>(
|
|
|
- new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master?.ID ?? CoreUtils.FullGuid));
|
|
|
- }
|
|
|
+ public string SectionName => "Stock Holdings";
|
|
|
+ public DataModel DataModel(Selection selection)
|
|
|
+ {
|
|
|
+ return new AutoDataModel<StockHolding>(
|
|
|
+ new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master?.ID ?? CoreUtils.FullGuid));
|
|
|
+ }
|
|
|
|
|
|
- public event DataModelUpdateEvent? OnUpdateDataModel;
|
|
|
- public bool IsReady { get; set; }
|
|
|
- public void CreateToolbarButtons(IPanelHost host)
|
|
|
- {
|
|
|
- }
|
|
|
+ public event DataModelUpdateEvent? OnUpdateDataModel;
|
|
|
+ public bool IsReady { get; set; }
|
|
|
+ public void CreateToolbarButtons(IPanelHost host)
|
|
|
+ {
|
|
|
+ }
|
|
|
|
|
|
- public Dictionary<string, object[]> Selected()
|
|
|
- {
|
|
|
- return new Dictionary<string, object[]>();
|
|
|
- }
|
|
|
+ public Dictionary<string, object[]> Selected()
|
|
|
+ {
|
|
|
+ return new Dictionary<string, object[]>();
|
|
|
+ }
|
|
|
|
|
|
- public void Heartbeat(TimeSpan time)
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
+ public void Heartbeat(TimeSpan time)
|
|
|
+ {
|
|
|
+
|
|
|
}
|
|
|
}
|