RequisitionItemJobRequisitionItemPage.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Windows.Media;
  6. using Comal.Classes;
  7. using InABox.Clients;
  8. using InABox.Core;
  9. using InABox.DynamicGrid;
  10. namespace PRSDesktop.Panels.Requisitions;
  11. public class JobJRISummary : BaseObject
  12. {
  13. public JobRequisitionItemLink JRI => InitializeField(ref _jRI, nameof(JRI));
  14. private JobRequisitionItemLink? _jRI;
  15. [DoubleEditor(Editable = Editable.Disabled)]
  16. public double Required { get; set; }
  17. [DoubleEditor(Editable = Editable.Disabled)]
  18. public double Issued { get; set; }
  19. [DoubleEditor]
  20. public double Quantity { get; set; }
  21. [CurrencyEditor]
  22. public double Cost { get; set; }
  23. }
  24. public class RequisitionItemJobRequitionPage : DynamicItemsListGrid<JobJRISummary>, ISpecificGrid
  25. {
  26. public RequisitionItem Item { get; set; }
  27. private class RequisitionItemJobRequisitionPageUI : DynamicGridGridUIComponent<JobJRISummary>
  28. {
  29. protected override Brush? GetCellBackground(CoreRow row, DynamicColumnBase column)
  30. {
  31. if (!row.Get<JobJRISummary, double>(c => c.Quantity).IsEffectivelyEqual(0.0))
  32. return new SolidColorBrush(Colors.LightGreen);
  33. return base.GetCellBackground(row, column);
  34. }
  35. }
  36. protected override IDynamicGridUIComponent<JobJRISummary> CreateUIComponent() => new RequisitionItemJobRequisitionPageUI() { Parent = this };
  37. protected override void Init()
  38. {
  39. base.Init();
  40. HiddenColumns.Add(x =>x.JRI.ID);
  41. HiddenColumns.Add(x=>x.JRI.Product.ID);
  42. HiddenColumns.Add(x => x.JRI.Product.Group.ID);
  43. HiddenColumns.Add(x=>x.JRI.Style.ID);
  44. HiddenColumns.Add(x=>x.JRI. Dimensions.Unit.ID);
  45. HiddenColumns.Add(x=>x.JRI.Dimensions.UnitSize);
  46. HiddenColumns.Add(x => x.JRI.Qty);
  47. HiddenColumns.Add(x=>x.Quantity);
  48. HiddenColumns.Add(x=>x.Cost);
  49. }
  50. protected override void DoReconfigure(DynamicGridOptions options)
  51. {
  52. base.DoReconfigure(options);
  53. options.Clear();
  54. options.FilterRows = true;
  55. options.DirectEdit = true;
  56. options.HideDirectEditButton = true;
  57. }
  58. protected override void Reload(
  59. Filters<JobJRISummary> criteria, Columns<JobJRISummary> columns, ref SortOrder<JobJRISummary>? sort,
  60. CancellationToken token, Action<CoreTable?, Exception?> action)
  61. {
  62. Items.Clear();
  63. var table = new CoreTable();
  64. table.LoadColumns(columns);
  65. Filters<JobRequisitionItem> itemfilters = new Filters<JobRequisitionItem>();
  66. itemfilters.Add(
  67. new Filter<JobRequisitionItem>(x => x.Job.ID).IsEqualTo(Item.RequisitionLink.JobLink.ID));
  68. foreach (var filter in criteria.Items)
  69. {
  70. var itemfilter = Serialization.Deserialize<Filter<JobRequisitionItem>>(Serialization.Serialize(filter));
  71. if (itemfilter is not null)
  72. itemfilters.Add(itemfilter);
  73. }
  74. Columns<JobRequisitionItem> itemcolumns = Columns.None<JobRequisitionItem>();
  75. foreach (var column in columns)
  76. itemcolumns.Add(column.Property.Replace("JRI.",""));
  77. SortOrder<JobRequisitionItem>? itemsort =
  78. Serialization.Deserialize<SortOrder<JobRequisitionItem>>(Serialization.Serialize(sort));
  79. MultiQuery query = new();
  80. query.Add<JobRequisitionItem>(
  81. itemfilters.Combine(),
  82. itemcolumns,
  83. itemsort
  84. );
  85. query.Add<StockMovement>(
  86. new Filter<StockMovement>(x=>x.Job.ID).IsEqualTo(Item.RequisitionLink.JobLink.ID)
  87. .And(x=>x.Type).IsEqualTo(StockMovementType.Issue),
  88. Columns.None<StockMovement>().Add(x=>x.JobRequisitionItem.ID).Add(x=>x.Issued)
  89. );
  90. query.Query(q =>
  91. {
  92. try
  93. {
  94. var mvmts = q.Get<StockMovement>()?.Rows.Select(r => r.ToObject<StockMovement>()).ToArray();
  95. var _jobRequisitionItems = q.Get<JobRequisitionItem>()?.Rows.Select(r => r.ToObject<JobRequisitionItem>()).ToArray();
  96. if (mvmts is not null && _jobRequisitionItems is not null)
  97. {
  98. foreach (var item in _jobRequisitionItems)
  99. {
  100. JobJRISummary summary = new JobJRISummary();
  101. summary.JRI.ID = item.ID;
  102. summary.JRI.Synchronise(item);
  103. summary.Required = item.Qty;
  104. var issues = mvmts.Where(x => x.JobRequisitionItem.ID == item.ID);
  105. summary.Issued = issues.Sum(x => x.Issued);
  106. if (summary.JRI.ID == Item.JobRequisitionItem.ID)
  107. summary.Quantity = Item.Quantity;
  108. summary.Cost = Item.Cost;
  109. Items.Add(summary);
  110. }
  111. table.LoadRows(Items);
  112. }
  113. action(table, null);
  114. }
  115. catch (Exception e)
  116. {
  117. Console.WriteLine(e);
  118. }
  119. });
  120. }
  121. private bool bFirst = true;
  122. protected override void OnAfterRefresh()
  123. {
  124. base.OnAfterRefresh();
  125. if (!bFirst)
  126. return;
  127. bFirst = false;
  128. SelectedRows = Data.Rows.Where(r =>
  129. r.Get<JobJRISummary, Guid>(c => c.JRI.ID) == Item.JobRequisitionItem.ID
  130. ).ToArray();
  131. if (SelectedRows.Any())
  132. ScrollIntoView(SelectedRows.First());
  133. }
  134. protected override DynamicGridColumns LoadColumns()
  135. {
  136. var columns = new DynamicGridColumns();
  137. columns.Add<JobJRISummary>(x => x.JRI.Requisition.Number, 50, "#", "", Alignment.MiddleCenter);
  138. columns.Add<JobJRISummary>(x => x.JRI.Requisition.Description, 200, "Requisition", "", Alignment.MiddleLeft);
  139. columns.Add<JobJRISummary>(x => x.JRI.Product.Code, 120, "Code", "", Alignment.MiddleCenter);
  140. columns.Add<JobJRISummary>(x => x.JRI.Product.Name, 0, "Name", "", Alignment.MiddleLeft);
  141. columns.Add<JobJRISummary>(x => x.JRI.Dimensions.UnitSize, 120, "Size", "", Alignment.MiddleCenter);
  142. columns.Add<JobJRISummary>(x => x.JRI.Style.Description, 150, "Style", "", Alignment.MiddleCenter);
  143. columns.Add<JobJRISummary>(x => x.Required, 100, "Required", "F2", Alignment.MiddleCenter);
  144. columns.Add<JobJRISummary>(x => x.Issued, 100, "Issued", "F2", Alignment.MiddleCenter);
  145. columns.Add<JobJRISummary>(x => x.Quantity, 100, "Quantity", "F2", Alignment.MiddleCenter);
  146. return columns;
  147. }
  148. protected override void Changed()
  149. {
  150. base.Changed();
  151. if (Item.ID != Guid.Empty && SelectedRows.Any())
  152. {
  153. foreach (var row in Data.Rows.Where(x=>x.Index != SelectedRows[0].Index))
  154. {
  155. if (!Items[row.Index].Quantity.IsEffectivelyEqual(0.0))
  156. {
  157. row.Set<JobJRISummary, double>(x => x.Quantity, 0.0);
  158. Items[row.Index].Quantity = 0.0;
  159. }
  160. }
  161. InvalidateGrid();
  162. }
  163. }
  164. }