using Comal.Classes; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; using Syncfusion.Data; using Syncfusion.UI.Xaml.Grid; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using System.Windows.Media; namespace PRSDesktop.Panels.Jobs.Summary; public class JobRequisitionItemSummaryGrid : DynamicDataGrid, ISpecificGrid { public int DueDateAlert { get; set; } public int DueDateWarning { get; set; } protected override bool ShowSequenceButtons => false; private class UIComponent : DynamicGridGridUIComponent { private JobRequisitionItemSummaryGrid Grid; public UIComponent(JobRequisitionItemSummaryGrid grid) { Grid = grid; Parent = grid; } protected override Brush? GetCellBackground(CoreRow row, DynamicColumnBase column) { if (column is DynamicGridColumn col) { if (String.Equals(col.ColumnName, CoreUtils.GetFullPropertyName(x => x.Requisition.DueDate, "."))) { var due = row.Get(x => x.Requisition.DueDate); if (!due.IsEmpty()) { var background = DateTime.Today > due.Date ? Colors.LightSalmon : DateTime.Today.AddDays(Grid.DueDateWarning) >= due.Date ? Colors.Orange : DateTime.Today.AddDays(Grid.DueDateAlert) >= due.Date ? Colors.LightYellow : Colors.LightGreen; return new SolidColorBrush(background) { Opacity = 0.5 }; } } } else if(column is DynamicActionColumn dac) { if (dac == Grid.InStockColumn || dac == Grid.OnOrderColumn) { return Colors.LightBlue.ToBrush(0.5); } else if (dac == Grid.TreatmentRequiredColumn || dac == Grid.TreatmentOnOrderColumn) { return Colors.Plum.ToBrush(0.5); } } var qty = row.Get(x => x.Qty); if(row.Get(x => x.Issued) >= qty) { return Colors.Silver.ToBrush(0.5); } else if(row.Get(x => x.Allocated) + row.Get(x => x.Issued) >= qty) { return Colors.LightGreen.ToBrush(0.5); } else if(row.Get(x => x.InStock) + row.Get(x => x.Issued) >= qty) { return Colors.Orange.ToBrush(0.5); } else { return Colors.LightSalmon.ToBrush(0.5); } } } private DynamicActionColumn InStockColumn; private DynamicActionColumn OnOrderColumn; private DynamicActionColumn TreatmentRequiredColumn; private DynamicActionColumn TreatmentOnOrderColumn; private DynamicActionColumn AllocatedColumn; private DynamicActionColumn IssuedColumn; public JobRequisitionItemSummaryGrid() { HiddenColumns.Add(x => x.Qty); HiddenColumns.Add(x => x.InStock); HiddenColumns.Add(x => x.OnOrder); HiddenColumns.Add(x => x.TreatmentOnOrder); HiddenColumns.Add(x => x.TreatmentRequired); HiddenColumns.Add(x => x.Allocated); HiddenColumns.Add(x => x.Issued); var qtyColumn = AddDoubleColumn(x => x.Qty, "Qty."); qtyColumn.GetSummary = () => { return new GridSummaryColumn { Name = "Qty", Format = "{Sum:F2}", MappingName = "Qty", SummaryType = Syncfusion.Data.SummaryType.Custom, CustomAggregate = new QtyAggregate() }; }; InStockColumn = AddDoubleColumn(x => x.InStock, "Stk."); OnOrderColumn = AddDoubleColumn(x => x.OnOrder, "Ord."); TreatmentRequiredColumn = AddDoubleColumn(x => x.TreatmentRequired, "Req."); TreatmentOnOrderColumn = AddDoubleColumn(x => x.TreatmentOnOrder, "Ord."); AllocatedColumn = AddDoubleColumn(x => x.Allocated, "Stk."); IssuedColumn = AddDoubleColumn(x => x.Issued, "Iss."); ColumnsTag = "JobRequisitionReview"; } private class QtyAggregate : ISummaryAggregate { public double Sum { get; private set; } public Action CalculateAggregateFunc() { return AggregateFunc; } private void AggregateFunc(IEnumerable items, string property, PropertyDescriptor args) { if (items is IEnumerable rows) { Sum = 0; foreach (var dataRow in rows) { Sum += (double)dataRow["Qty"]; } } else { Logger.Send(LogType.Error, "", $"Attempting to calculate aggregate on invalid data type '{items.GetType()}'."); } } } private DynamicActionColumn AddDoubleColumn(Expression> property, string header) { var col = new DynamicTextColumn(property) { Format = "F2", HeaderText = header, Width = 50 }; ActionColumns.Add(col); return col; } protected override IDynamicGridUIComponent CreateUIComponent() { return new UIComponent(this); } protected override void DoReconfigure(DynamicGridOptions options) { base.DoReconfigure(options); options.Clear(); options.FilterRows = true; options.SelectColumns = true; options.RecordCount = true; } public override DynamicGridColumns GenerateColumns() { var columns = new DynamicGridColumns(); columns.Add(x => x.Requisition.DueDate, 80, "Due", "", Alignment.MiddleCenter); columns.Add(x => x.Requisition.Job.JobNumber, 70, "Job", "", Alignment.MiddleCenter); columns.Add(x => x.Requisition.Number, 50, "Requi", "", Alignment.MiddleCenter); columns.Add(x => x.Product.Code, 100, "Product Code", "", Alignment.MiddleLeft); columns.Add(x => x.Product.Name, 0, "Product Name", "", Alignment.MiddleLeft); columns.Add(x => x.Style.Code, 100, "Style", "", Alignment.MiddleLeft); columns.Add(x => x.Dimensions.UnitSize, 70, "Size", "", Alignment.MiddleLeft); columns.Add(x => x.Status, 90, "Status", "", Alignment.MiddleCenter); return columns; } protected override void ConfigureColumnGroups() { GetColumnGrouping() .AddGroup("Stock", InStockColumn, OnOrderColumn) .AddGroup("Treatment", TreatmentRequiredColumn, TreatmentOnOrderColumn) .AddGroup("Allocated", AllocatedColumn, IssuedColumn); } }