using Comal.Classes; using InABox.Core; using Syncfusion.Windows.Controls.Grid; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace PRSDesktop { [ValueConversion(typeof(double), typeof(GridLength))] public class PercentGridLengthConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is not double d) return new GridLength(0); return new GridLength(d, GridUnitType.Star); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class ManufacturingJobModel { public string JobNumber { get; set; } public string JobName { get; set; } public Guid JobID { get; set; } public int NHours { get; set; } public int NMinutes { get; set; } public string TimeRequired => $"{NHours}:{NMinutes:D2}"; public int NPackets { get; set; } public int NItems { get; set; } public double PercentGreen { get; set; } public double PercentYellow { get; set; } public double PercentRed { get; set; } public ManufacturingJobModel(Guid jobID, string jobNumber, string jobName) { JobID = jobID; JobNumber = jobNumber; JobName = jobName; } } /// /// Interaction logic for ManufacturingPanelJobColumn.xaml /// public partial class ManufacturingPanelJobColumn : UserControl, IManufacturingPanelColumn { public string Title { get => (string)ColumnTitle.Content; set { ColumnTitle.Content = value; HiddenTitle.Content = value; } } private bool _collapsed; public bool Collapsed { get => _collapsed; set { _collapsed = value; ColumnGrid.ColumnDefinitions[0].Width = value ? new GridLength(0, GridUnitType.Pixel) : new GridLength(1, GridUnitType.Star); ColumnGrid.ColumnDefinitions[1].Width = value ? new GridLength(1, GridUnitType.Auto) : new GridLength(0, GridUnitType.Pixel); MinWidth = _collapsed ? 35.0F : 300.0F; OnCollapsed?.Invoke(this, value); } } public Guid Category { get; set; } public event CollapsingEventHandler? OnCollapsed; public ManufacturingPanelData Data { get; set; } private List Packets = new(); public delegate void SelectJobEvent(Guid jobID); public event SelectJobEvent? OnSelectJob; public ManufacturingPanelJobColumn() { InitializeComponent(); } public void SetPackets(IEnumerable packets) { Packets = packets.ToList(); var models = new List(); foreach(var jobPackets in Packets.GroupBy(x => x.SetoutLink.JobLink.ID).OrderBy(x => x.Key)) { var jobrow = Data.Jobs.Rows.FirstOrDefault(r => r.Get(c => c.ID).Equals(jobPackets.Key)); if (jobrow is null) continue; var model = new ManufacturingJobModel( jobrow.Get(x => x.ID), jobrow.Get(x => x.JobNumber), jobrow.Get(x => x.Name)); int nGreen = 0; int nYellow = 0; int nRed = 0; double nHours = 0; foreach(var packet in jobPackets) { nHours += packet.StageLink.Time.TotalHours * (1 - packet.StageLink.PercentageComplete / 100.0f); ++model.NPackets; model.NItems += packet.Quantity; var dueDate = packet.DueDate.IsEmpty() ? DateTime.Today : packet.DueDate; var estDate = packet.EstimatedDate.IsEmpty() ? DateTime.Today : packet.EstimatedDate; if (dueDate < estDate) ++nRed; else if (dueDate < estDate.AddDays(7)) ++nYellow; else ++nGreen; } model.NHours = (int)Math.Floor(nHours); model.NMinutes = (int)((nHours - model.NHours) * 60); model.PercentGreen = (double)nGreen / model.NPackets * 100.0; model.PercentYellow = (double)nYellow / model.NPackets * 100.0; model.PercentRed = (double)nRed / model.NPackets * 100.0; models.Add(model); } Collapsed = models.Count == 0; ItemCount.Content = string.Format("{0} Jobs", models.Count); HiddenCount.Content = string.Format(" ({0} Jobs)", models.Count); TimeRequired.Content = string.Format("Time Required: {0:F2} hrs", models.Sum(x => x.NHours + x.NMinutes / 60.0)); Items.ItemsSource = models; } public IEnumerable GetSelectedPackets() => Packets; public IEnumerable GetPackets() => Packets; private void CollapseColumn_Click(object sender, MouseButtonEventArgs e) { Collapsed = true; } private void ExpandColumn_Click(object sender, MouseButtonEventArgs e) { Collapsed = false; } private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (sender is not FrameworkElement el || el.Tag is not Guid jobID) return; if(e.ClickCount == 2) { OnSelectJob?.Invoke(jobID); } } } }