JobRequisitionItemSummaryGrid.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using Comal.Classes;
  2. using InABox.Configuration;
  3. using InABox.Core;
  4. using InABox.DynamicGrid;
  5. using InABox.WPF;
  6. using Syncfusion.Data;
  7. using Syncfusion.UI.Xaml.Grid;
  8. using System;
  9. using System.Collections;
  10. using System.Collections.Generic;
  11. using System.ComponentModel;
  12. using System.Data;
  13. using System.Linq;
  14. using System.Linq.Expressions;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using System.Windows.Media;
  18. namespace PRSDesktop.Panels.Jobs.Summary;
  19. public class JobRequisitionItemSummaryGrid : DynamicDataGrid<JobRequisitionItem>, ISpecificGrid
  20. {
  21. public int DueDateAlert { get; set; }
  22. public int DueDateWarning { get; set; }
  23. protected override bool ShowSequenceButtons => false;
  24. private class UIComponent : DynamicGridGridUIComponent<JobRequisitionItem>
  25. {
  26. private JobRequisitionItemSummaryGrid Grid;
  27. public UIComponent(JobRequisitionItemSummaryGrid grid)
  28. {
  29. Grid = grid;
  30. Parent = grid;
  31. }
  32. protected override Brush? GetCellBackground(CoreRow row, DynamicColumnBase column)
  33. {
  34. if (column is DynamicGridColumn col)
  35. {
  36. if (String.Equals(col.ColumnName,
  37. CoreUtils.GetFullPropertyName<JobRequisitionItem, DateTime>(x => x.Requisition.DueDate, ".")))
  38. {
  39. var due = row.Get<JobRequisitionItem, DateTime>(x => x.Requisition.DueDate);
  40. if (!due.IsEmpty())
  41. {
  42. var background = DateTime.Today > due.Date
  43. ? Colors.LightSalmon
  44. : DateTime.Today.AddDays(Grid.DueDateWarning) >= due.Date
  45. ? Colors.Orange
  46. : DateTime.Today.AddDays(Grid.DueDateAlert) >= due.Date
  47. ? Colors.LightYellow
  48. : Colors.LightGreen;
  49. return new SolidColorBrush(background) { Opacity = 0.5 };
  50. }
  51. }
  52. }
  53. else if(column is DynamicActionColumn dac)
  54. {
  55. if (dac == Grid.InStockColumn
  56. || dac == Grid.OnOrderColumn)
  57. {
  58. return Colors.LightBlue.ToBrush(0.5);
  59. }
  60. else if (dac == Grid.TreatmentRequiredColumn
  61. || dac == Grid.TreatmentOnOrderColumn)
  62. {
  63. return Colors.Plum.ToBrush(0.5);
  64. }
  65. }
  66. var qty = row.Get<JobRequisitionItem, double>(x => x.Qty);
  67. if(row.Get<JobRequisitionItem, double>(x => x.Issued) >= qty)
  68. {
  69. return Colors.Silver.ToBrush(0.5);
  70. }
  71. else if(row.Get<JobRequisitionItem, double>(x => x.Allocated) + row.Get<JobRequisitionItem, double>(x => x.Issued) >= qty)
  72. {
  73. return Colors.LightGreen.ToBrush(0.5);
  74. }
  75. else if(row.Get<JobRequisitionItem, double>(x => x.InStock) + row.Get<JobRequisitionItem, double>(x => x.Issued) >= qty)
  76. {
  77. return Colors.Orange.ToBrush(0.5);
  78. }
  79. else
  80. {
  81. return Colors.LightSalmon.ToBrush(0.5);
  82. }
  83. }
  84. }
  85. private DynamicActionColumn InStockColumn;
  86. private DynamicActionColumn OnOrderColumn;
  87. private DynamicActionColumn TreatmentRequiredColumn;
  88. private DynamicActionColumn TreatmentOnOrderColumn;
  89. private DynamicActionColumn AllocatedColumn;
  90. private DynamicActionColumn IssuedColumn;
  91. public JobRequisitionItemSummaryGrid()
  92. {
  93. HiddenColumns.Add(x => x.Qty);
  94. HiddenColumns.Add(x => x.InStock);
  95. HiddenColumns.Add(x => x.OnOrder);
  96. HiddenColumns.Add(x => x.TreatmentOnOrder);
  97. HiddenColumns.Add(x => x.TreatmentRequired);
  98. HiddenColumns.Add(x => x.Allocated);
  99. HiddenColumns.Add(x => x.Issued);
  100. var qtyColumn = AddDoubleColumn(x => x.Qty, "Qty.");
  101. qtyColumn.GetSummary = () =>
  102. {
  103. return new GridSummaryColumn
  104. {
  105. Name = "Qty",
  106. Format = "{Sum:F2}",
  107. MappingName = "Qty",
  108. SummaryType = Syncfusion.Data.SummaryType.Custom,
  109. CustomAggregate = new QtyAggregate()
  110. };
  111. };
  112. InStockColumn = AddDoubleColumn(x => x.InStock, "Stk.");
  113. OnOrderColumn = AddDoubleColumn(x => x.OnOrder, "Ord.");
  114. TreatmentRequiredColumn = AddDoubleColumn(x => x.TreatmentRequired, "Req.");
  115. TreatmentOnOrderColumn = AddDoubleColumn(x => x.TreatmentOnOrder, "Ord.");
  116. AllocatedColumn = AddDoubleColumn(x => x.Allocated, "Stk.");
  117. IssuedColumn = AddDoubleColumn(x => x.Issued, "Iss.");
  118. ColumnsTag = "JobRequisitionReview";
  119. }
  120. private class QtyAggregate : ISummaryAggregate
  121. {
  122. public double Sum { get; private set; }
  123. public Action<IEnumerable, string, PropertyDescriptor> CalculateAggregateFunc()
  124. {
  125. return AggregateFunc;
  126. }
  127. private void AggregateFunc(IEnumerable items, string property, PropertyDescriptor args)
  128. {
  129. if (items is IEnumerable<DataRowView> rows)
  130. {
  131. Sum = 0;
  132. foreach (var dataRow in rows)
  133. {
  134. Sum += (double)dataRow["Qty"];
  135. }
  136. }
  137. else
  138. {
  139. Logger.Send(LogType.Error, "", $"Attempting to calculate aggregate on invalid data type '{items.GetType()}'.");
  140. }
  141. }
  142. }
  143. private DynamicActionColumn AddDoubleColumn(Expression<Func<JobRequisitionItem, object>> property, string header)
  144. {
  145. var col = new DynamicTextColumn<JobRequisitionItem>(property) { Format = "F2", HeaderText = header, Width = 50 };
  146. ActionColumns.Add(col);
  147. return col;
  148. }
  149. protected override IDynamicGridUIComponent<JobRequisitionItem> CreateUIComponent()
  150. {
  151. return new UIComponent(this);
  152. }
  153. protected override void DoReconfigure(DynamicGridOptions options)
  154. {
  155. base.DoReconfigure(options);
  156. options.Clear();
  157. options.FilterRows = true;
  158. options.SelectColumns = true;
  159. options.RecordCount = true;
  160. }
  161. public override DynamicGridColumns GenerateColumns()
  162. {
  163. var columns = new DynamicGridColumns();
  164. columns.Add<JobRequisitionItem, DateTime>(x => x.Requisition.DueDate, 80, "Due", "", Alignment.MiddleCenter);
  165. columns.Add<JobRequisitionItem, string>(x => x.Requisition.Job.JobNumber, 70, "Job", "", Alignment.MiddleCenter);
  166. columns.Add<JobRequisitionItem, int>(x => x.Requisition.Number, 50, "Requi", "", Alignment.MiddleCenter);
  167. columns.Add<JobRequisitionItem, string>(x => x.Product.Code, 100, "Product Code", "", Alignment.MiddleLeft);
  168. columns.Add<JobRequisitionItem, string>(x => x.Product.Name, 0, "Product Name", "", Alignment.MiddleLeft);
  169. columns.Add<JobRequisitionItem, string>(x => x.Style.Code, 100, "Style", "", Alignment.MiddleLeft);
  170. columns.Add<JobRequisitionItem, string>(x => x.Dimensions.UnitSize, 70, "Size", "", Alignment.MiddleLeft);
  171. return columns;
  172. }
  173. protected override void ConfigureColumnGroups()
  174. {
  175. GetColumnGrouping()
  176. .AddGroup("Stock", InStockColumn, OnOrderColumn)
  177. .AddGroup("Treatment", TreatmentRequiredColumn, TreatmentOnOrderColumn)
  178. .AddGroup("Allocated", AllocatedColumn, IssuedColumn);
  179. }
  180. }