JobStockGrid.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Windows.Controls;
  6. using com.sun.xml.@internal.ws.api.config.management;
  7. using Comal.Classes;
  8. using InABox.Clients;
  9. using InABox.Core;
  10. using InABox.DynamicGrid;
  11. using InABox.Wpf;
  12. using InABox.WPF;
  13. using net.sf.mpxj.MpxjUtilities;
  14. namespace PRSDesktop.Panels.Jobs
  15. {
  16. public class JobStockGrid : DynamicDataGrid<StockHolding>, IMasterDetailControl<Job,StockHolding>, IBasePanel
  17. {
  18. public Job? Master
  19. {
  20. get => _master;
  21. set
  22. {
  23. _master = value;
  24. _releaseStock.IsEnabled = value?.JobStatus.Active == false && SelectedRows?.Any() == true;
  25. }
  26. }
  27. private Button _releaseStock;
  28. private Job? _master;
  29. public JobStockGrid()
  30. {
  31. _releaseStock = AddButton("Release Stock", PRSDesktop.Resources.archive.AsBitmapImage(), ReleaseStock);
  32. HiddenColumns.Add(x => x.Location.ID);
  33. HiddenColumns.Add(x => x.Product.ID);
  34. HiddenColumns.Add(x => x.Style.ID);
  35. HiddenColumns.Add(x=>x.Dimensions.Unit.ID);
  36. HiddenColumns.Add(x=>x.Dimensions.Height);
  37. HiddenColumns.Add(x=>x.Dimensions.Length);
  38. HiddenColumns.Add(x=>x.Dimensions.Width);
  39. HiddenColumns.Add(x=>x.Dimensions.Quantity);
  40. HiddenColumns.Add(x=>x.Dimensions.Weight);
  41. HiddenColumns.Add(x => x.Job.ID);
  42. }
  43. protected override void Init()
  44. {
  45. base.Init();
  46. }
  47. protected override void SelectItems(CoreRow[]? rows)
  48. {
  49. base.SelectItems(rows);
  50. _releaseStock.IsEnabled = Master?.JobStatus.Active == false && SelectedRows?.Any() == true;
  51. }
  52. private bool ReleaseStock(object sender, CoreRow[] rows)
  53. {
  54. if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will release the selected holdings from this job.", "Confirm") != MessageWindowResult.Yes)
  55. return false;
  56. var toSave = new List<StockMovement>();
  57. foreach (var row in SelectedRows)
  58. {
  59. StockHolding holding = row.ToObject<StockHolding>();
  60. var movements = new Client<StockMovement>().Query(
  61. StockHolding.GetFilter(holding),
  62. new Columns<StockMovement>(x => x.Units)
  63. .Add(x => x.Location.ID)
  64. .Add(x => x.Product.ID)
  65. .Add(x => x.Style.ID)
  66. .AddDimensionsColumns(x => x.Dimensions)
  67. .Add(x => x.Cost)
  68. .Add(x => x.OrderItem.ID)
  69. .Add(x => x.JobRequisitionItem.ID))
  70. .ToObjects<StockMovement>()
  71. .GroupBy(x => new
  72. {
  73. Location = x.Location.ID,
  74. Product = x.Product.ID,
  75. Style = x.Style.ID,
  76. x.Dimensions,
  77. x.Cost,
  78. OrderItem = x.OrderItem.ID,
  79. JobRequisitionItem = x.JobRequisitionItem.ID
  80. })
  81. .Select(x => new
  82. {
  83. x.Key,
  84. Units = x.Sum(x => x.Units)
  85. }
  86. );
  87. foreach (var group in movements)
  88. {
  89. var from = holding.CreateMovement();
  90. from.OrderItem.ID = group.Key.OrderItem;
  91. from.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
  92. from.Cost = group.Key.Cost;
  93. from.Type = StockMovementType.TransferOut;
  94. from.Job.ID = Master.ID;
  95. from.Issued = group.Units;
  96. var to = holding.CreateMovement();
  97. to.Cost = group.Key.Cost;
  98. to.OrderItem.ID = group.Key.OrderItem;
  99. to.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
  100. to.Type = StockMovementType.TransferIn;
  101. to.Transaction = from.Transaction;
  102. to.Units = group.Units;
  103. toSave.Add(from);
  104. toSave.Add(to);
  105. }
  106. }
  107. new Client<StockMovement>().Save(toSave, "Released job stock.");
  108. Refresh(false,true);
  109. MessageWindow.ShowMessage("All job stock reserves released.", "Success");
  110. return true;
  111. }
  112. public Filter<StockHolding> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
  113. ? new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master.ID)
  114. : new Filter<StockHolding>().None();
  115. protected override void DoReconfigure(FluentList<DynamicGridOption> options)
  116. {
  117. base.DoReconfigure(options);
  118. options
  119. .BeginUpdate()
  120. .Clear()
  121. .Add(DynamicGridOption.FilterRows)
  122. .Add(DynamicGridOption.RecordCount)
  123. .Add(DynamicGridOption.SelectColumns)
  124. .Add(DynamicGridOption.ExportData)
  125. .EndUpdate();
  126. }
  127. protected override void Reload(Filters<StockHolding> criteria, Columns<StockHolding> columns, ref SortOrder<StockHolding>? sort, Action<CoreTable?, Exception?> action)
  128. {
  129. criteria.Add(MasterDetailFilter);
  130. base.Reload(criteria, columns, ref sort, action);
  131. }
  132. public void Setup()
  133. {
  134. Refresh(true,false);
  135. }
  136. public void Shutdown(CancelEventArgs? cancel)
  137. {
  138. }
  139. public void Refresh()
  140. {
  141. Refresh(false,true);
  142. }
  143. public string SectionName => "Stock Holdings";
  144. public DataModel DataModel(Selection selection)
  145. {
  146. return new AutoDataModel<StockHolding>(
  147. new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master?.ID ?? CoreUtils.FullGuid));
  148. }
  149. public event DataModelUpdateEvent? OnUpdateDataModel;
  150. public bool IsReady { get; set; }
  151. public void CreateToolbarButtons(IPanelHost host)
  152. {
  153. }
  154. public Dictionary<string, object[]> Selected()
  155. {
  156. return new Dictionary<string, object[]>();
  157. }
  158. public void Heartbeat(TimeSpan time)
  159. {
  160. }
  161. }
  162. }