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);
}
}
}
}