using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using Comal.Classes;
using InABox.Clients;
using InABox.Core;
using InABox.DynamicGrid;
using InABox.Reports;
using InABox.Core.Reports;
using InABox.Wpf.Reports;
using InABox.WPF;
namespace PRSDesktop
{
[ValueConversion(typeof(DateTime), typeof(Visibility))]
public class DateTimeToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var dateTime = (DateTime)value;
if (dateTime.IsEmpty())
return Visibility.Collapsed;
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class TemplateViewModel
{
public Guid TemplateID { get; set; }
public string Name { get; set; }
public string Time { get; set; }
public TemplateViewModel()
{
TemplateID = Guid.Empty;
Name = "";
Time = "";
}
}
public delegate void CollapsingEventHandler(object sender, bool collapsed);
///
/// Interaction logic for ManufacturingPanelColumn.xaml
///
public partial class ManufacturingPanelColumn : UserControl, IManufacturingPanelColumn
{
private static readonly BitmapImage barcode = PRSDesktop.Resources.barcode.AsBitmapImage();
private static readonly BitmapImage disabled = PRSDesktop.Resources.disabled.AsBitmapImage();
private static readonly BitmapImage speechbubble = PRSDesktop.Resources.speechbubble.AsBitmapImage();
private bool _collapsed;
private bool _compactview;
private DynamicDataGrid? pg;
//public List CheckedKanbans = new List();
public ManufacturingPanelColumn()
{
InitializeComponent();
LoadTemplates();
}
private void LoadTemplates()
{
Task.Run(() =>
{
CoreTable table = new Client().Query(null,
new Columns
(
x => x.Template.ID,
x => x.Section.Name,
x => x.Time
)
);
foreach (CoreRow row in table.Rows)
{
TemplateViewModel model = new TemplateViewModel
{
TemplateID = row.Get(x => x.Template.ID),
Name = row.Get(x => x.Section.Name),
Time = row.Get(x => x.Time).ToString()
};
templateStages.Add(model);
}
});
}
public string Title
{
get => (string)ColumnTitle.Content;
set
{
ColumnTitle.Content = value;
HiddenTitle.Content = value;
}
}
public bool CompactView
{
get => _compactview;
set
{
_compactview = value;
Items.ItemTemplate = _compactview
? Resources["CompactManufacturingPanel"] as DataTemplate
: Resources["FullManufacturingPanel"] as DataTemplate;
}
}
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 ManufacturingKanban[] Kanbans
{
get => (ManufacturingKanban[])Items.ItemsSource;
set
{
Items.ItemsSource = value;
ItemCount.Content = string.Format("{0} Items", value.Length);
HiddenCount.Content = string.Format(" ({0} items)", value.Length);
Task.Run(() =>
{
try
{
var time = CalcTime(value);
Dispatcher.Invoke(() => { TimeRequired.Content = string.Format("Time Required: {0:F2} hrs", time); });
}
catch (Exception e)
{
Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
}
});
Collapsed = value.Length == 0;
}
}
public ManufacturingPanelData Data { get; set; }
public List Packets { get; set; }
private List templateStages = new List();
private ManufacturingTemplateStage[] TemplateStages { get; set; }
private double CalcTime(IEnumerable kanbans)
{
return Kanbans.Sum(x => x.Time.TotalHours * ((100.0F - x.PercentageComplete) / 100.0F));
}
public event EventHandler OnChanged;
public event CollapsingEventHandler OnCollapsed;
private static string GetColor(DateTime duedate, DateTime estdate)
{
var color = "LightGreen";
if (duedate < estdate)
color = "Salmon";
else if (duedate < estdate.AddDays(7))
color = "LightYellow";
return color;
}
public void SetPackets(IEnumerable packets)
{
var checkedKanbans = GetSelectedKanbans("").Select(x => x.ID).ToList();
var kanbans = new List();
Packets = packets.ToList();
foreach (var packet in Packets)
{
var bOK = true;
var completed = packet.Completed;
var onhold = packet.OnHold;
var issues = packet.Issues;
var orderitemid = packet.OrderItem.ID;
var orderitem = orderitemid != Guid.Empty ? Data.OrderItems.FirstOrDefault(x => x.Item1.Equals(orderitemid)) : null;
var itp = packet.ITP.ID;
var jobid = packet.SetoutLink.JobLink.ID;
var sectionid = packet.StageLink.SectionID;
var title = packet.Title;
var serial = packet.Serial;
var watermark = packet.WaterMark;
var location = packet.Location;
var setoutlocation = packet.SetoutLink.Location;
var setoutnumber = packet.SetoutLink.Number;
var setoutdescription = packet.SetoutLink.Description;
var templateid = packet.ManufacturingTemplateLink.ID;
var templatecode = Data.Templates.FirstOrDefault(x => x.ID.Equals(templateid))?.Code;
if (bOK)
{
var id = packet.ID;
var priority = packet.Priority;
var distributed = packet.Distributed;
var barcodeqty = packet.BarcodeQty;
var quantity = packet.Quantity;
var estimateddate = packet.EstimatedDate;
var created = packet.Created;
var duedate = packet.DueDate;
var barcodeprinted = packet.BarcodePrinted;
var barcodetype = packet.BarcodeType;
var stageid = packet.StageLink.ID;
var stageValid = packet.StageLink.IsValid();
var station = packet.StageLink.Station;
var time = packet.StageLink.Time;
var percentagecomplete = packet.StageLink.PercentageComplete;
var jobrow = Data.Jobs.Rows.FirstOrDefault(r => r.Get(c => c.ID).Equals(jobid));
var jobname = jobrow?.Get(c => c.Name);
var jobnumber = jobrow?.Get(c => c.JobNumber);
var model = new ManufacturingKanban();
var flags = new List();
if (onhold)
flags.Add("HOLD");
if (priority)
flags.Add("PRIORITY");
if (distributed)
flags.Add("DISTRIB");
model.ID = id.ToString();
var sTitle = string.Format("{0}{1}", quantity != barcodeqty ? string.Format("{0} x ", quantity) : "",
packet.Title);
model.Title = CompactView
? string.Format("{0} x {1} / {2} {3}",
barcodeqty,
setoutnumber,
serial,
sTitle
)
: string.Format("{0}: {1}",
serial,
sTitle
);
if (!string.IsNullOrWhiteSpace(watermark))
model.Title = "[" + watermark + "] " + model.Title;
model.Quantity = barcodeqty;
model.JobName = string.Format("{0}: {1}", setoutnumber, jobname);
model.CreatedDate = created;
model.DueDate = duedate;
model.Time = time;
model.PercentageComplete = percentagecomplete;
if (string.IsNullOrEmpty(location))
location = setoutlocation;
var descrip = new List
{
location
};
if (orderitem != null)
descrip.Add(orderitem.Item3);
model.Description = string.Join("\n", descrip);
model.TemplateID = packet.ManufacturingTemplateLink.ID;
model.Image = !barcodeprinted.IsEmpty() ? barcode : barcodetype == BarcodeType.None ? disabled : null;
model.Tags = new string[] { };
model.Category = completed != DateTime.MinValue ? CoreUtils.FullGuid : sectionid;
if (priority)
model.ColorKey = "Red";
else if (onhold)
model.ColorKey = "Silver";
else
model.ColorKey = GetColor(
duedate.IsEmpty() ? DateTime.Today : duedate,
estimateddate.IsEmpty() ? DateTime.Today : estimateddate
);
model.IssuesImage = string.IsNullOrWhiteSpace(issues)
? null
: speechbubble;
model.Issues = issues;
if (orderitem != null)
{
var bOnOrder = orderitem.Item2.IsEmpty();
model.OrderColor = bOnOrder ? "Plum" : "DarkOrchid";
model.OrderStatus = bOnOrder ? "ON ORDER" : "RECEIVED";
}
else
{
model.OrderColor = model.ColorKey;
model.OrderStatus = "";
}
model.Checked = checkedKanbans.Contains(id.ToString());
model.Flags = string.Join("\n", flags);
model.Template = templatecode;
if (!stageValid || stageid.Equals(Guid.Empty) || stageid.Equals(CoreUtils.FullGuid))
{
model.Status = "";
}
else
{
if (station == 0)
model.Status = "Not Started";
else
model.Status = string.Format("{0} ({1:F0}%)", station == -1 ? "Shared" : "Stn " + station, percentagecomplete);
}
kanbans.Add(model);
}
}
Kanbans = kanbans.ToArray();
}
public void ClearSelectedKanbans()
{
var kanbans = GetSelectedKanbans(Guid.Empty.ToString());
foreach (var kanban in kanbans)
kanban.Checked = false;
var tmp = Kanbans;
Items.ItemsSource = null;
Items.ItemsSource = tmp;
}
public ManufacturingKanban[] GetSelectedKanbans(string currentid)
{
return Kanbans != null ? Kanbans.Where(x => x.Checked || x.ID.Equals(currentid)).ToArray() : new ManufacturingKanban[] { };
}
public IEnumerable GetPackets() => Packets;
public IEnumerable GetSelectedPackets() => GetSelectedPackets(Guid.Empty.ToString());
public IEnumerable GetSelectedPackets(string currentid)
{
var selectedkanbans = GetSelectedKanbans(currentid);
return Packets.Where(pkt => selectedkanbans.Any(x => x.ID.Equals(pkt.ID.ToString())));
}
private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
{
var model = ((Border)sender).Tag as ManufacturingKanban;
var packet = Packets.Where(r => r.ID.ToString().Equals(model.ID)).FirstOrDefault();
var setoutid = packet.SetoutLink.ID;
var table = new Client().Query(new Filter(x => x.EntityLink.ID).IsEqualTo(setoutid));
IEntityDocument[] docs = table.Rows.Select(r => r.ToObject()).ToArray();
var viewer = new DocumentEditor(docs);
viewer.ButtonsVisible = true;
//viewer.PrintAllowed = Security.IsAllowed();
viewer.SaveAllowed = Security.IsAllowed();
viewer.Watermark = packet.WaterMark;
viewer.ShowDialog();
e.Handled = true;
}
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
//ManufacturingKanban task = ((CheckBox)sender).Tag as ManufacturingKanban;
//if (CheckedKanbans.Contains(task.ID))
// CheckedKanbans.Remove(task.ID);
//else
// CheckedKanbans.Add(task.ID);
}
private void PacketMenu_Opened(object sender, RoutedEventArgs e)
{
var menu = sender as ContextMenu;
var issue = menu.Items[2] as MenuItem;
var progress = menu.Items[3] as MenuItem;
var split = menu.Items[4] as MenuItem;
var revert = menu.Items[5] as MenuItem;
var progress_separator = menu.Items[6] as Separator;
var cancel = menu.Items[7] as MenuItem;
var cancel_separator = menu.Items[8] as Separator;
var bHasCancel = false;
var complete = menu.Items[9] as MenuItem;
var complete_separator = menu.Items[10] as Separator;
var bHasComplete = false;
var template = menu.Items[11] as MenuItem;
var template_separator = menu.Items[12] as Separator;
var bHasTemplate = true;
var changedate = menu.Items[13] as MenuItem;
var changedate_separator = menu.Items[14] as Separator;
var setpriority = menu.Items[15] as MenuItem;
var clearpriority = menu.Items[16] as MenuItem;
var priority_separator = menu.Items[17] as Separator;
var editissues = menu.Items[18] as MenuItem;
var sethold = menu.Items[19] as MenuItem;
var clearhold = menu.Items[20] as MenuItem;
var hold_separator = menu.Items[21] as Separator;
var generate = menu.Items[22] as MenuItem;
var reprint = menu.Items[23] as MenuItem;
var revoke = menu.Items[24] as MenuItem;
var barcode_separator = menu.Items[25] as Separator;
var bHasBarcode = false;
var archive = menu.Items[26] as MenuItem;
var bHasArchive = false;
var model = menu.Tag as ManufacturingKanban;
var packets = GetSelectedPackets(model.ID).ToList();
var current = packets.FirstOrDefault(x => x.ID.Equals(Guid.Parse(model.ID)));
//CoreRow row = packets.Rows.Where(r => r.Get(c => c.ID).ToString().Equals(model.ID)).FirstOrDefault();
var OnlyOne = packets.Count == 1; // (!CheckedKanbans.Any()) || (CheckedKanbans.Count == 1) && (CheckedKanbans.Contains(model.ID));
var pktid = current != null ? current.ID : Guid.Empty; // row.Get(x => x.ID);
var stageid = current != null ? current.StageLink.ID : Guid.Empty; // row.Get(x => x.StageLink.ID);
var stageValid = current?.StageLink.IsValid() ?? false;
var completed = current != null ? current.Completed : DateTime.MinValue; //row.Get(x => x.Completed);
var printed = current != null
? current.BarcodePrinted
: DateTime.MinValue; // row.Get(x => x.BarcodePrinted);
var priority = current != null ? current.Priority : false; // row.Get(x => x.Priority);
//bool onhold = current != null ? current.OnHold : false; // row.Get(x => x.OnHold);
var onhold = current?.OnHold == true; // row.Get(x => x.OnHold);
var qty = current != null ? current.Quantity : 0; //row.Get(x => x.Quantity);
var barcodetype =
current != null ? current.BarcodeType : BarcodeType.None; // row.Get(x => x.BarcodeType);
issue.Visibility = !stageValid && Security.IsAllowed() ? Visibility.Visible : Visibility.Collapsed;
progress.Visibility = stageid.Equals(CoreUtils.FullGuid) || !stageValid ? Visibility.Collapsed : Visibility.Visible;
split.Visibility = !stageValid && qty > 1 && printed.IsEmpty() && OnlyOne ? Visibility.Visible : Visibility.Collapsed;
revert.Visibility = !stageValid && completed.Equals(DateTime.MinValue) ? Visibility.Collapsed : Visibility.Visible;
cancel.Visibility = !stageValid ? Visibility.Visible : Visibility.Collapsed;
bHasCancel = cancel.Visibility == Visibility.Visible;
complete.Visibility = stageid.Equals(CoreUtils.FullGuid) ? Visibility.Collapsed : Visibility.Visible;
bHasComplete = complete.Visibility == Visibility.Visible;
template.Visibility = !stageValid ? Visibility.Visible : Visibility.Collapsed;
template.Items.Clear();
var menus = new Dictionary();
foreach (var Factory in Data.Factories)
{
if (!menus.ContainsKey(Factory.Name))
{
menus[Factory.Name] = new MenuItem { Header = Factory.Name };
template.Items.Add(menus[Factory.Name]);
}
var group = menus[Factory.Name];
foreach (var temp in Data.Templates.Where(x => x.Factory.ID == Factory.ID).OrderBy(x => x.Code))
{
var item = new MenuItem
{
Header = string.Format("{0}: {1}", temp.Code, temp.Name),
Tag = new Tuple(pktid, temp)
};
item.Click += ChangeTemplateClick;
group.Items.Add(item);
}
}
bHasTemplate = template.Visibility == Visibility.Visible;
changedate.Visibility = stageid.Equals(CoreUtils.FullGuid) || !stageValid ? Visibility.Collapsed : Visibility.Visible;
changedate_separator.Visibility = changedate.Visibility;
setpriority.Visibility = priority ? Visibility.Collapsed : Visibility.Visible;
clearpriority.Visibility = priority ? Visibility.Visible : Visibility.Collapsed;
editissues.Visibility = Visibility.Visible;
sethold.Visibility = Security.IsAllowed() && !onhold ? Visibility.Visible : Visibility.Collapsed;
clearhold.Visibility = Security.IsAllowed() && onhold ? Visibility.Visible : Visibility.Collapsed;
generate.Visibility = printed.IsEmpty() && barcodetype != BarcodeType.None ? Visibility.Visible : Visibility.Collapsed;
reprint.Visibility = !printed.IsEmpty() ? Visibility.Visible : Visibility.Collapsed;
revoke.Visibility = !printed.IsEmpty() ? Visibility.Visible : Visibility.Collapsed;
bHasBarcode = generate.Visibility == Visibility.Visible || reprint.Visibility == Visibility.Visible ||
revoke.Visibility == Visibility.Visible;
archive.Visibility = !printed.IsEmpty() ? Visibility.Visible : Visibility.Collapsed;
bHasArchive = archive.Visibility == Visibility.Visible;
progress_separator.Visibility = bHasCancel || bHasTemplate || bHasBarcode || bHasArchive ? Visibility.Visible : Visibility.Collapsed;
cancel_separator.Visibility = bHasCancel && (bHasComplete || bHasTemplate || bHasBarcode || bHasArchive)
? Visibility.Visible
: Visibility.Collapsed;
complete_separator.Visibility = bHasComplete && (bHasTemplate || bHasBarcode || bHasArchive) ? Visibility.Visible : Visibility.Collapsed;
template_separator.Visibility = bHasTemplate && (bHasBarcode || bHasArchive) ? Visibility.Visible : Visibility.Collapsed;
hold_separator.Visibility = bHasBarcode || bHasArchive ? Visibility.Visible : Visibility.Collapsed;
barcode_separator.Visibility = bHasBarcode && bHasArchive ? Visibility.Visible : Visibility.Collapsed;
}
private void ChangeTemplateClick(object sender, RoutedEventArgs e)
{
var menu = (MenuItem)sender;
var binding = (Tuple)menu.Tag;
var template = binding.Item2;
if (TemplateStages == null)
TemplateStages = new Client().Load(null, new SortOrder(x => x.Sequence));
var templatestages = TemplateStages.Where(x => x.Template.ID.Equals(template.ID));
var packets = GetSelectedPackets(binding.Item1.ToString());
if (!packets.Any())
{
MessageBox.Show("Please select a packet before continuing");
return;
}
Progress.Show("Loading Packet Stages");
Filter stgflt = null;
Filter pktflt = null;
foreach (var packet in packets)
{
stgflt = stgflt == null
? new Filter(x => x.Parent.ID).IsEqualTo(packet.ID)
: stgflt.Or(x => x.Parent.ID).IsEqualTo(packet.ID);
pktflt = pktflt == null ? new Filter(x => x.ID).IsEqualTo(packet.ID) : pktflt.Or(x => x.ID).IsEqualTo(packet.ID);
}
var packetstages = new Client().Load(stgflt).ToList();
foreach (var packetstage in packetstages)
new Client().Delete(packetstage, "");
packetstages.Clear();
var pkts = new Client().Load(pktflt);
foreach (var packet in pkts)
{
packet.ManufacturingTemplateLink.ID = template.ID;
packet.ManufacturingTemplateLink.Code = template.Code;
packet.Group = template.Factory.Name;
var attributes = new Dictionary();
//if (packet.CustomAttributes == null)
// packet.CustomAttributes = new PackableList();
//foreach (var attribute in packet.CustomAttributes)
// attributes[attribute.Name] = attribute.Value;
//packet.CustomAttributes.Clear();
//if (template.CustomAttributes != null)
// packet.CustomAttributes.AddRange(template.CustomAttributes);
//foreach (var attribute in packet.CustomAttributes)
//{
// if (attributes.ContainsKey(attribute.Name))
// attribute.Value = attributes[attribute.Name];
//}
packet.StageLink.ID = Guid.Empty;
foreach (var templatestage in templatestages)
{
var packetstage = new ManufacturingPacketStage
{
Time = templatestage.Time,
Sequence = templatestage.Sequence,
SequenceType = templatestage.SequenceType,
Started = DateTime.MinValue,
PercentageComplete = 0.0F,
Completed = DateTime.MinValue,
QualityChecks = templatestage.QualityChecks,
QualityStatus = QualityStatus.NotChecked,
QualityNotes = ""
};
packetstage.ManufacturingSectionLink.ID = templatestage.Section.ID;
packetstage.ManufacturingSectionLink.Name = templatestage.Section.Name;
packetstage.Parent.ID = packet.ID;
packetstages.Add(packetstage);
}
}
if (packetstages.Any())
{
Progress.SetMessage("Updating Packets");
new Client().Save(pkts, "Packet Template changed by User");
new Client().Save(packetstages, "Packet Template changed by User");
OnChanged?.Invoke(this, new EventArgs());
}
Progress.Close();
}
private void ViewSetout_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
var pkt = Packets.Where(r => r.ID.ToString().Equals(model.ID)).FirstOrDefault();
if (pkt == null)
{
MessageBox.Show("Cannot find selected Manufacturing Packet!");
return;
}
var id = pkt.ID;
pg ??= new DynamicDataGrid();
ManufacturingPacket? editPacket = null;
using (new WaitCursor())
{
var columns = pg.LoadEditorColumns();
editPacket = new Client()
.Query(
new Filter(x => x.ID).IsEqualTo(id),
columns)
.Rows.FirstOrDefault()?.ToObject();
}
if (editPacket == null)
{
MessageBox.Show("Unable to load packet from database");
return;
}
if (pg.EditItems(new[] { editPacket }))
OnChanged?.Invoke(this, new EventArgs());
}
private void IssueSetout_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
var date = model.DueDate.IsEmpty() ? DateTime.Today.AddDays(14) : model.DueDate;
if (DateEdit.Execute("Required Completion Date", ref date))
ProgressPacket(model, date);
}
private void ProgressSetout_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
ProgressPacket(model, null);
}
private void ProgressPacket(ManufacturingKanban model, DateTime? date)
{
Progress.Show("");
var pkts = GetSelectedPackets(model.ID).ToList();
Progress.SetMessage("Loading Stages");
Filter? stgflt = null;
foreach (var pkt in pkts)
stgflt = stgflt == null
? new Filter(x => x.Parent.ID).IsEqualTo(pkt.ID)
: stgflt.Or(x => x.Parent.ID).IsEqualTo(pkt.ID);
var stgs = new Client().Load(stgflt, new SortOrder(x => x.Sequence));
ManufacturingPacket.Progress(pkts, stgs);
Progress.SetMessage("Progressing Items");
var stgupdate = stgs.Where(x => x.IsChanged()).ToArray();
Logger.Send(LogType.Information, ClientFactory.UserID,
string.Format("ManufacturingPanelColumn.ProgressPacket() - Updating [{0}] stages", stgupdate.Length));
new Client().Save(stgupdate, "ManufacturingPacket Progressed by Menu Click");
var pktupdate = pkts; //.Where(x => x.IsChanged()).ToArray();
if (date.HasValue)
foreach (var pkt in pktupdate)
pkt.DueDate = date.Value;
Logger.Send(LogType.Information, ClientFactory.UserID,
string.Format("ManufacturingPanelColumn.ProgressPacket() - Updating [{0}] packets: {1}", pktupdate.Count,
string.Join(", ", pktupdate.Select(x => x.Serial))));
new Client().Save(pktupdate, "ManufacturingPacket Progressed by Menu Click");
Progress.Close();
ClearSelectedKanbans();
//CheckedKanbans.Clear();
OnChanged?.Invoke(this, new EventArgs());
}
private void SplitSetout_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
var pkts = GetSelectedPackets(model.ID).ToList();
if (pkts.Count != 1)
{
MessageBox.Show("You can only split one Packet at a time!");
return;
}
var pkt = pkts.First();
var packets = new List { pkt };
var Quantity = 1;
if (NumberEdit.Execute("Quantity to Issue", 1, pkt.Quantity, ref Quantity))
{
if (Quantity != pkt.Quantity)
{
var packet2 = CoreUtils.Clone(pkt, null);
packet2.ID = Guid.Empty;
packet2.Quantity = Quantity;
pkt.Quantity -= Quantity;
packets.Add(packet2);
}
new Client().Save(packets, "Split Manufacturing Packet");
var stages = new Client().Load(
new Filter(x => x.Parent.ID).IsEqualTo(pkt.ID));
foreach (var stage in stages)
{
stage.ID = Guid.Empty;
stage.Parent.ID = pkt.ID;
}
new Client().Save(stages, "");
OnChanged?.Invoke(this, new EventArgs());
}
}
private void RevertSetout_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var pkts = GetSelectedPackets(model.ID).ToList();
Filter? stgflt = null;
foreach (var pkt in pkts)
stgflt = stgflt == null
? new Filter(x => x.Parent.ID).IsEqualTo(pkt.ID)
: stgflt.Or(x => x.Parent.ID).IsEqualTo(pkt.ID);
var stgs = new Client().Load(stgflt, new SortOrder(x => x.Sequence));
ManufacturingPacket.Regress(pkts, stgs);
Progress.SetMessage("Regressing Items");
new Client().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Regressed by Menu Click");
new Client().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Regressed by Menu Click");
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
OnChanged?.Invoke(this, new EventArgs());
}
private void CancelSetout_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show(
"This will cancel the selected packet (and any associated barcodes) and remove it from view.\n\nAre you sure you wish to continue?",
"Confirm packet cancellation", MessageBoxButton.YesNo).Equals(MessageBoxResult.Yes))
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var pkts = GetSelectedPackets(model.ID);
var updates = new List();
foreach (var packet in pkts)
{
packet.BarcodePrinted = DateTime.MinValue;
packet.Archived = DateTime.Now;
updates.Add(packet);
}
Progress.SetMessage("Archiving Packets");
new Client().Save(updates, "ManufacturingPacket Cancelled by Menu Click");
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
OnChanged?.Invoke(this, new EventArgs());
}
}
private void CompeteItem_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var pkts = GetSelectedPackets(model.ID);
Progress.SetMessage("Loading Stages");
Filter? stgflt = null;
foreach (var pkt in pkts)
stgflt = stgflt == null
? new Filter(x => x.Parent.ID).IsEqualTo(pkt.ID)
: stgflt.Or(x => x.Parent.ID).IsEqualTo(pkt.ID);
var stgs = new Client().Query(
stgflt,
new Columns(x => x.ID)
.Add(x => x.Parent.ID)
.Add(x => x.Sequence),
new SortOrder(x => x.Sequence)
).Rows.Select(x => x.ToObject()).ToArray();
while (pkts.Any(x => x.Completed.IsEmpty())) ManufacturingPacket.Progress(pkts, stgs);
Progress.SetMessage("Progressing Items");
new Client().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
new Client().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
Progress.Close();
ClearSelectedKanbans();
//CheckedKanbans.Clear();
OnChanged?.Invoke(this, new EventArgs());
}
private void ChangeDate_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
var pkts = GetSelectedPackets(model.ID);
DateTime? date = null;
foreach (var pkt in pkts)
if (!date.HasValue)
date = pkt.DueDate;
else if (!date.Value.Equals(pkt.DueDate))
date = date > pkt.DueDate ? date : pkt.DueDate;
var date2 = date ?? DateTime.Today.AddDays(14) ;
if (DateEdit.Execute("Required Completion Date", ref date2))
{
Progress.SetMessage("Updating Packets");
foreach (var pkt in pkts)
pkt.DueDate = date2;
new Client().Save(pkts, string.Format("Changed Due Date To {0:dd MMM yy}", date2));
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
OnChanged?.Invoke(this, new EventArgs());
}
}
private void UpdatePriority(object sender, bool priority)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var pkts = GetSelectedPackets(model.ID).ToList();
foreach(var packet in pkts)
{
packet.Priority = priority;
}
Logger.Send(LogType.Information, ClientFactory.UserID,
string.Format("ManufacturingPanelColumn.UpdatePriority() - Updating [{0}] packets: {1}", pkts.Count,
string.Join(", ", pkts.Select(x => x.Serial))));
Progress.SetMessage("Updating Packets");
new Client().Save(pkts, "Priority Flag " + (priority ? "Set" : "Cleared"));
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
OnChanged?.Invoke(this, new EventArgs());
}
private void SetPriority_Click(object sender, RoutedEventArgs e)
{
UpdatePriority(sender, true);
}
private void ClearPriority_Click(object sender, RoutedEventArgs e)
{
UpdatePriority(sender, false);
}
private void UpdateHold(object sender, bool hold)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
if (MessageBox.Show(
hold
? "Are you sure you want to place a hold on this packet?"
: "Are you sure you want to release this packet from hold?",
hold
? "Confirm Hold"
: "Confirm Release",
MessageBoxButton.YesNo,
MessageBoxImage.Question
) != MessageBoxResult.Yes
)
return;
Progress.ShowModal("Updating Hold Flags", (Action>)(progress =>
{
var pkts = GetSelectedPackets(model.ID).Select(x =>
{
x.OnHold = hold;
return x;
});
progress.Report("Updating Packets");
new Client().Save(pkts, "Hold Flag " + (hold ? "Set" : "Cleared"));
}));
ClearSelectedKanbans();
OnChanged?.Invoke(this, new EventArgs());
}
private void EditIssues_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
var pkts = GetSelectedPackets(model.ID).ToArray();
if (new DynamicIssuesEditor(pkts, true).ShowDialog() == true)
{
Progress.ShowModal("Updating Issues", progress => { new Client().Save(pkts, "Updated Issues"); });
ClearSelectedKanbans();
OnChanged?.Invoke(this, new EventArgs());
}
}
private void SetHold_Click(object sender, RoutedEventArgs e)
{
UpdateHold(sender, true);
}
private void ClearHold_Click(object sender, RoutedEventArgs e)
{
UpdateHold(sender, false);
}
private void PrintBarcodes(IEnumerable pkts)
{
//Filter filter = null;
//foreach (var pkt in pkts)
//{
// if (filter == null)
// filter = new Filter(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID);
// else
// filter.Ors.Add(new Filter(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID));
//}
//Dictionary dataenvironment = new Dictionary();
//Client delclient = new Client();
//CoreTable items = delclient.Query(
// filter,
// null,
// //new Columns(
// // x => x.ID,
// // x => x.Barcode,
// // x => x.SetoutLink.Reference,
// // x => x.SetoutLink.Location,
// // x => x.SetoutLink.JobLink.JobNumber,
// // x => x.SetoutLink.JobLink.Name,
// // x => x.ManufacturingPacketLink.Serial,
// // x => x.Description,
// // x => x.Attributes
// //),
// new SortOrder(x => x.Sequence)
//);
//dataenvironment[typeof(DeliveryItem)] = items;
var ids = pkts.Select(x => x.ID).ToArray();
var datamodel = new DeliveryItemDataModel(new Filter(x => x.ManufacturingPacketLink.ID).InList(ids));
var repclient = new Client();
var ReportName = "Print Bar Codes" + (!string.IsNullOrWhiteSpace(pkts.First().Group) ? " - " + pkts.First().Group : "");
var report = repclient.Load(new Filter(x => x.DataModel).IsEqualTo(datamodel.Name).And(x => x.Name).IsEqualTo(ReportName))
.FirstOrDefault();
if (report == null)
{
ReportName = "Print Bar Codes";
report = repclient.Load(new Filter(x => x.DataModel).IsEqualTo(datamodel.Name).And(x => x.Name).IsEqualTo(ReportName))
.FirstOrDefault();
}
if (report == null)
{
MessageBox.Show(string.Format("{0} -> [{1}] report does not exist!", datamodel.Name, ReportName));
return;
}
ReportUtils.PreviewReport(report, datamodel, false, Security.IsAllowed());
}
private void GenerateBarcodes_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var pkts = GetSelectedPackets(model.ID).Where(x => x.BarcodePrinted.IsEmpty() && x.BarcodeType != BarcodeType.None).ToArray();
if (!pkts.Any())
{
MessageBox.Show("Please select a packet before continuing");
return;
}
Filter pktflt = null;
foreach (var packet in pkts)
pktflt = pktflt == null ? new Filter(x => x.ID).IsEqualTo(packet.ID) : pktflt.Or(x => x.ID).IsEqualTo(packet.ID);
pkts = new Client().Load(pktflt);
for (var i = 0; i < pkts.Length; i++)
{
var packet = pkts[i];
packet.BarcodePrinted = DateTime.Now;
}
Progress.SetMessage("Creating Barcodes");
Logger.Send(LogType.Information, ClientFactory.UserID,
string.Format("ManufacturingPanelColumn.GenerateBarcodes() - Updating [{0}] packets: {1}", pkts.Length,
string.Join(", ", pkts.Select(x => x.Serial))));
new Client().Save(pkts, "Delivery Barcodes created");
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
PrintBarcodes(pkts);
OnChanged?.Invoke(this, new EventArgs());
}
private void ReprintBarcodes_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
var pkts = GetSelectedPackets(model.ID);
PrintBarcodes(pkts.Where(x => !x.BarcodePrinted.IsEmpty()));
}
private void RevokeBarcodes_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("This will clear out any delivery items already assigned to racks!\n\nAre you sure you wish to continue?",
"Confirm revocation", MessageBoxButton.YesNo).Equals(MessageBoxResult.Yes))
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var pkts = GetSelectedPackets(model.ID).Where(x => !x.BarcodePrinted.IsEmpty()).ToArray();
for (var i = 0; i < pkts.Length; i++)
{
Progress.SetMessage(string.Format("Revoking: {0:F2}% complete", (double)i * 100.0F / pkts.Length));
var packet = pkts[i];
packet.BarcodePrinted = DateTime.MinValue;
}
Progress.SetMessage("Revoking Barcodes");
new Client().Save(pkts, "Delivery Barcodes revoked");
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
OnChanged?.Invoke(this, new EventArgs());
}
}
private void ArchiveSetout_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("This will remove the selected packet from view.\n\nAre you sure you wish to continue?", "Confirm item completion",
MessageBoxButton.YesNo).Equals(MessageBoxResult.Yes))
{
var item = (MenuItem)sender;
var model = (ManufacturingKanban)item.Tag;
Progress.Show("");
var updates = new List();
foreach(var packet in GetSelectedPackets(model.ID))
{
if (!packet.BarcodePrinted.IsEmpty())
{
//while (packet.Completed.IsEmpty())
// packet.MoveNext();
packet.Archived = DateTime.Now;
updates.Add(packet);
}
}
Progress.SetMessage("Archiving Items");
new Client().Save(updates, "ManufacturingPacket Archived by Menu Click");
ClearSelectedKanbans();
//CheckedKanbans.Clear();
Progress.Close();
OnChanged?.Invoke(this, new EventArgs());
}
}
private void SelectAll_Click(object sender, RoutedEventArgs e)
{
//CheckedKanbans.Clear();
foreach (var kanban in Kanbans)
kanban.Checked = true;
var tmp = Kanbans;
Items.ItemsSource = null;
Items.ItemsSource = tmp;
}
private void ClearAll_Click(object sender, RoutedEventArgs e)
{
ClearSelectedKanbans();
//CheckedKanbans.Clear();
//foreach (var kanban in Kanbans)
//{
// kanban.Checked = false;
// CheckedKanbans.Add(kanban.ID);
//}
var tmp = Kanbans;
Items.ItemsSource = null;
Items.ItemsSource = tmp;
}
private void ExpandColumn_Click(object sender, MouseButtonEventArgs e)
{
Collapsed = false;
}
private void CollapseColumn_Click(object sender, MouseButtonEventArgs e)
{
Collapsed = true;
}
private void Template_MouseEnter(object sender, MouseEventArgs e)
{
}
private void Template_MouseLeave(object sender, MouseEventArgs e)
{
}
private void ToolTip_Opened(object sender, RoutedEventArgs e)
{
if (sender.GetType().FullName.Equals(
"System.Windows.Controls.ToolTip"))
{
ToolTip t = (ToolTip)sender;
Dispatcher.Invoke(() =>
{
t.Content = new TextBlock { Text = "Loading..." };
});
ManufacturingKanban kanban = t.DataContext as ManufacturingKanban;
Task.Run(() =>
{
string s = "";
int count = 1;
var list = templateStages.Where(x => x.TemplateID == kanban.TemplateID);
foreach (var stage in list)
{
if (count > 1)
s = s + System.Environment.NewLine;
s = s + count + ". " + stage.Name + " (" + stage.Time + ")";
count++;
}
Dispatcher.Invoke(() =>
{
t.Content = new TextBlock { Text = s };
});
});
}
}
}
}