ManufacturingPanelColumn.xaml.cs 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Input;
  10. using System.Windows.Media.Imaging;
  11. using Comal.Classes;
  12. using InABox.Clients;
  13. using InABox.Core;
  14. using InABox.DynamicGrid;
  15. using InABox.Reports;
  16. using InABox.Reports.Common;
  17. using InABox.WPF;
  18. namespace PRSDesktop
  19. {
  20. [ValueConversion(typeof(DateTime), typeof(Visibility))]
  21. public class DateTimeToVisibilityConverter : IValueConverter
  22. {
  23. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  24. {
  25. var dateTime = (DateTime)value;
  26. if (dateTime.IsEmpty())
  27. return Visibility.Collapsed;
  28. return Visibility.Visible;
  29. }
  30. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  31. {
  32. throw new NotImplementedException();
  33. }
  34. }
  35. public class TemplateViewModel
  36. {
  37. public Guid TemplateID { get; set; }
  38. public string Name { get; set; }
  39. public string Time { get; set; }
  40. public TemplateViewModel()
  41. {
  42. TemplateID = Guid.Empty;
  43. Name = "";
  44. Time = "";
  45. }
  46. }
  47. public delegate void CollapsingEventHandler(object sender, bool collapsed);
  48. /// <summary>
  49. /// Interaction logic for ManufacturingPanelColumn.xaml
  50. /// </summary>
  51. public partial class ManufacturingPanelColumn : UserControl, IManufacturingPanelColumn
  52. {
  53. private static readonly BitmapImage barcode = PRSDesktop.Resources.barcode.AsBitmapImage();
  54. private static readonly BitmapImage disabled = PRSDesktop.Resources.disabled.AsBitmapImage();
  55. private static readonly BitmapImage speechbubble = PRSDesktop.Resources.speechbubble.AsBitmapImage();
  56. private bool _collapsed;
  57. private bool _compactview;
  58. private DynamicDataGrid<ManufacturingPacket>? pg;
  59. //public List<String> CheckedKanbans = new List<string>();
  60. public ManufacturingPanelColumn()
  61. {
  62. InitializeComponent();
  63. LoadTemplates();
  64. }
  65. private void LoadTemplates()
  66. {
  67. Task.Run(() =>
  68. {
  69. CoreTable table = new Client<ManufacturingTemplateStage>().Query(null,
  70. new Columns<ManufacturingTemplateStage>
  71. (
  72. x => x.Template.ID,
  73. x => x.Section.Name,
  74. x => x.Time
  75. )
  76. );
  77. foreach (CoreRow row in table.Rows)
  78. {
  79. TemplateViewModel model = new TemplateViewModel
  80. {
  81. TemplateID = row.Get<ManufacturingTemplateStage, Guid>(x => x.Template.ID),
  82. Name = row.Get<ManufacturingTemplateStage, string>(x => x.Section.Name),
  83. Time = row.Get<ManufacturingTemplateStage, TimeSpan>(x => x.Time).ToString()
  84. };
  85. templateStages.Add(model);
  86. }
  87. });
  88. }
  89. public string Title
  90. {
  91. get => (string)ColumnTitle.Content;
  92. set
  93. {
  94. ColumnTitle.Content = value;
  95. HiddenTitle.Content = value;
  96. }
  97. }
  98. public bool CompactView
  99. {
  100. get => _compactview;
  101. set
  102. {
  103. _compactview = value;
  104. Items.ItemTemplate = _compactview
  105. ? Resources["CompactManufacturingPanel"] as DataTemplate
  106. : Resources["FullManufacturingPanel"] as DataTemplate;
  107. }
  108. }
  109. public bool Collapsed
  110. {
  111. get => _collapsed;
  112. set
  113. {
  114. _collapsed = value;
  115. ColumnGrid.ColumnDefinitions[0].Width = value ? new GridLength(0, GridUnitType.Pixel) : new GridLength(1, GridUnitType.Star);
  116. ColumnGrid.ColumnDefinitions[1].Width = value ? new GridLength(1, GridUnitType.Auto) : new GridLength(0, GridUnitType.Pixel);
  117. MinWidth = _collapsed ? 35.0F : 300.0F;
  118. OnCollapsed?.Invoke(this, value);
  119. }
  120. }
  121. public Guid Category { get; set; }
  122. public ManufacturingKanban[] Kanbans
  123. {
  124. get => (ManufacturingKanban[])Items.ItemsSource;
  125. set
  126. {
  127. Items.ItemsSource = value;
  128. ItemCount.Content = string.Format("{0} Items", value.Length);
  129. HiddenCount.Content = string.Format(" ({0} items)", value.Length);
  130. Task.Run(() =>
  131. {
  132. try
  133. {
  134. var time = CalcTime(value);
  135. Dispatcher.Invoke(() => { TimeRequired.Content = string.Format("Time Required: {0:F2} hrs", time); });
  136. }
  137. catch (Exception e)
  138. {
  139. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  140. }
  141. });
  142. Collapsed = value.Length == 0;
  143. }
  144. }
  145. public ManufacturingPanelData Data { get; set; }
  146. public List<ManufacturingPacket> Packets { get; set; }
  147. private List<TemplateViewModel> templateStages = new List<TemplateViewModel>();
  148. private ManufacturingTemplateStage[] TemplateStages { get; set; }
  149. private double CalcTime(IEnumerable<ManufacturingKanban> kanbans)
  150. {
  151. return Kanbans.Sum(x => x.Time.TotalHours * ((100.0F - x.PercentageComplete) / 100.0F));
  152. }
  153. public event EventHandler OnChanged;
  154. public event CollapsingEventHandler OnCollapsed;
  155. private static string GetColor(DateTime duedate, DateTime estdate)
  156. {
  157. var color = "LightGreen";
  158. if (duedate < estdate)
  159. color = "Salmon";
  160. else if (duedate < estdate.AddDays(7))
  161. color = "LightYellow";
  162. return color;
  163. }
  164. public void SetPackets(IEnumerable<ManufacturingPacket> packets)
  165. {
  166. var checkedKanbans = GetSelectedKanbans("").Select(x => x.ID).ToList();
  167. var kanbans = new List<ManufacturingKanban>();
  168. Packets = packets.ToList();
  169. foreach (var packet in Packets)
  170. {
  171. var bOK = true;
  172. var completed = packet.Completed;
  173. var onhold = packet.OnHold;
  174. var issues = packet.Issues;
  175. var orderitemid = packet.OrderItem.ID;
  176. var orderitem = orderitemid != Guid.Empty ? Data.OrderItems.FirstOrDefault(x => x.Item1.Equals(orderitemid)) : null;
  177. var itp = packet.ITP.ID;
  178. var jobid = packet.SetoutLink.JobLink.ID;
  179. var sectionid = packet.StageLink.SectionID;
  180. var title = packet.Title;
  181. var serial = packet.Serial;
  182. var watermark = packet.WaterMark;
  183. var location = packet.Location;
  184. var setoutlocation = packet.SetoutLink.Location;
  185. var setoutnumber = packet.SetoutLink.Number;
  186. var setoutdescription = packet.SetoutLink.Description;
  187. var templateid = packet.ManufacturingTemplateLink.ID;
  188. var templatecode = Data.Templates.FirstOrDefault(x => x.ID.Equals(templateid))?.Code;
  189. if (bOK)
  190. {
  191. var id = packet.ID;
  192. var priority = packet.Priority;
  193. var distributed = packet.Distributed;
  194. var barcodeqty = packet.BarcodeQty;
  195. var quantity = packet.Quantity;
  196. var estimateddate = packet.EstimatedDate;
  197. var created = packet.Created;
  198. var duedate = packet.DueDate;
  199. var barcodeprinted = packet.BarcodePrinted;
  200. var barcodetype = packet.BarcodeType;
  201. var stageid = packet.StageLink.ID;
  202. var stageValid = packet.StageLink.IsValid();
  203. var station = packet.StageLink.Station;
  204. var time = packet.StageLink.Time;
  205. var percentagecomplete = packet.StageLink.PercentageComplete;
  206. var jobrow = Data.Jobs.Rows.FirstOrDefault(r => r.Get<Job, Guid>(c => c.ID).Equals(jobid));
  207. var jobname = jobrow?.Get<Job, string>(c => c.Name);
  208. var jobnumber = jobrow?.Get<Job, string>(c => c.JobNumber);
  209. var model = new ManufacturingKanban();
  210. var flags = new List<string>();
  211. if (onhold)
  212. flags.Add("HOLD");
  213. if (priority)
  214. flags.Add("PRIORITY");
  215. if (distributed)
  216. flags.Add("DISTRIB");
  217. model.ID = id.ToString();
  218. var sTitle = string.Format("{0}{1}", quantity != barcodeqty ? string.Format("{0} x ", quantity) : "",
  219. packet.Title);
  220. model.Title = CompactView
  221. ? string.Format("{0} x {1} / {2} {3}",
  222. barcodeqty,
  223. setoutnumber,
  224. serial,
  225. sTitle
  226. )
  227. : string.Format("{0}: {1}",
  228. serial,
  229. sTitle
  230. );
  231. if (!string.IsNullOrWhiteSpace(watermark))
  232. model.Title = "[" + watermark + "] " + model.Title;
  233. model.Quantity = barcodeqty;
  234. model.JobName = string.Format("{0}: {1}", setoutnumber, jobname);
  235. model.CreatedDate = created;
  236. model.DueDate = duedate;
  237. model.Time = time;
  238. model.PercentageComplete = percentagecomplete;
  239. if (string.IsNullOrEmpty(location))
  240. location = setoutlocation;
  241. var descrip = new List<string>
  242. {
  243. location
  244. };
  245. if (orderitem != null)
  246. descrip.Add(orderitem.Item3);
  247. model.Description = string.Join("\n", descrip);
  248. model.TemplateID = packet.ManufacturingTemplateLink.ID;
  249. model.Image = !barcodeprinted.IsEmpty() ? barcode : barcodetype == BarcodeType.None ? disabled : null;
  250. model.Tags = new string[] { };
  251. model.Category = completed != DateTime.MinValue ? CoreUtils.FullGuid : sectionid;
  252. if (priority)
  253. model.ColorKey = "Red";
  254. else if (onhold)
  255. model.ColorKey = "Silver";
  256. else
  257. model.ColorKey = GetColor(
  258. duedate.IsEmpty() ? DateTime.Today : duedate,
  259. estimateddate.IsEmpty() ? DateTime.Today : estimateddate
  260. );
  261. model.IssuesImage = string.IsNullOrWhiteSpace(issues)
  262. ? null
  263. : speechbubble;
  264. model.Issues = issues;
  265. if (orderitem != null)
  266. {
  267. var bOnOrder = orderitem.Item2.IsEmpty();
  268. model.OrderColor = bOnOrder ? "Plum" : "DarkOrchid";
  269. model.OrderStatus = bOnOrder ? "ON ORDER" : "RECEIVED";
  270. }
  271. else
  272. {
  273. model.OrderColor = model.ColorKey;
  274. model.OrderStatus = "";
  275. }
  276. model.Checked = checkedKanbans.Contains(id.ToString());
  277. model.Flags = string.Join("\n", flags);
  278. model.Template = templatecode;
  279. if (!stageValid || stageid.Equals(Guid.Empty) || stageid.Equals(CoreUtils.FullGuid))
  280. {
  281. model.Status = "";
  282. }
  283. else
  284. {
  285. if (station == 0)
  286. model.Status = "Not Started";
  287. else
  288. model.Status = string.Format("{0} ({1:F0}%)", station == -1 ? "Shared" : "Stn " + station, percentagecomplete);
  289. }
  290. kanbans.Add(model);
  291. }
  292. }
  293. Kanbans = kanbans.ToArray();
  294. }
  295. public void ClearSelectedKanbans()
  296. {
  297. var kanbans = GetSelectedKanbans(Guid.Empty.ToString());
  298. foreach (var kanban in kanbans)
  299. kanban.Checked = false;
  300. var tmp = Kanbans;
  301. Items.ItemsSource = null;
  302. Items.ItemsSource = tmp;
  303. }
  304. public ManufacturingKanban[] GetSelectedKanbans(string currentid)
  305. {
  306. return Kanbans != null ? Kanbans.Where(x => x.Checked || x.ID.Equals(currentid)).ToArray() : new ManufacturingKanban[] { };
  307. }
  308. public IEnumerable<ManufacturingPacket> GetPackets() => Packets;
  309. public IEnumerable<ManufacturingPacket> GetSelectedPackets() => GetSelectedPackets(Guid.Empty.ToString());
  310. public IEnumerable<ManufacturingPacket> GetSelectedPackets(string currentid)
  311. {
  312. var selectedkanbans = GetSelectedKanbans(currentid);
  313. return Packets.Where(pkt => selectedkanbans.Any(x => x.ID.Equals(pkt.ID.ToString())));
  314. }
  315. private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  316. {
  317. if (e.ClickCount == 2)
  318. {
  319. var model = ((Border)sender).Tag as ManufacturingKanban;
  320. var packet = Packets.Where(r => r.ID.ToString().Equals(model.ID)).FirstOrDefault();
  321. var setoutid = packet.SetoutLink.ID;
  322. var table = new Client<SetoutDocument>().Query(new Filter<SetoutDocument>(x => x.EntityLink.ID).IsEqualTo(setoutid));
  323. IEntityDocument[] docs = table.Rows.Select(r => r.ToObject<SetoutDocument>()).ToArray();
  324. var viewer = new DocumentEditor(docs);
  325. viewer.ButtonsVisible = true;
  326. //viewer.PrintAllowed = Security.IsAllowed<CanPrintFactoryFloorDrawings>();
  327. viewer.SaveAllowed = Security.IsAllowed<CanSaveFactoryFloorDrawings>();
  328. viewer.Watermark = packet.WaterMark;
  329. viewer.ShowDialog();
  330. e.Handled = true;
  331. }
  332. }
  333. private void CheckBox_Checked(object sender, RoutedEventArgs e)
  334. {
  335. //ManufacturingKanban task = ((CheckBox)sender).Tag as ManufacturingKanban;
  336. //if (CheckedKanbans.Contains(task.ID))
  337. // CheckedKanbans.Remove(task.ID);
  338. //else
  339. // CheckedKanbans.Add(task.ID);
  340. }
  341. private void PacketMenu_Opened(object sender, RoutedEventArgs e)
  342. {
  343. var menu = sender as ContextMenu;
  344. var issue = menu.Items[2] as MenuItem;
  345. var progress = menu.Items[3] as MenuItem;
  346. var split = menu.Items[4] as MenuItem;
  347. var revert = menu.Items[5] as MenuItem;
  348. var progress_separator = menu.Items[6] as Separator;
  349. var cancel = menu.Items[7] as MenuItem;
  350. var cancel_separator = menu.Items[8] as Separator;
  351. var bHasCancel = false;
  352. var complete = menu.Items[9] as MenuItem;
  353. var complete_separator = menu.Items[10] as Separator;
  354. var bHasComplete = false;
  355. var template = menu.Items[11] as MenuItem;
  356. var template_separator = menu.Items[12] as Separator;
  357. var bHasTemplate = true;
  358. var changedate = menu.Items[13] as MenuItem;
  359. var changedate_separator = menu.Items[14] as Separator;
  360. var setpriority = menu.Items[15] as MenuItem;
  361. var clearpriority = menu.Items[16] as MenuItem;
  362. var priority_separator = menu.Items[17] as Separator;
  363. var editissues = menu.Items[18] as MenuItem;
  364. var sethold = menu.Items[19] as MenuItem;
  365. var clearhold = menu.Items[20] as MenuItem;
  366. var hold_separator = menu.Items[21] as Separator;
  367. var generate = menu.Items[22] as MenuItem;
  368. var reprint = menu.Items[23] as MenuItem;
  369. var revoke = menu.Items[24] as MenuItem;
  370. var barcode_separator = menu.Items[25] as Separator;
  371. var bHasBarcode = false;
  372. var archive = menu.Items[26] as MenuItem;
  373. var bHasArchive = false;
  374. var model = menu.Tag as ManufacturingKanban;
  375. var packets = GetSelectedPackets(model.ID).ToList();
  376. var current = packets.FirstOrDefault(x => x.ID.Equals(Guid.Parse(model.ID)));
  377. //CoreRow row = packets.Rows.Where(r => r.Get<ManufacturingPacket, Guid>(c => c.ID).ToString().Equals(model.ID)).FirstOrDefault();
  378. var OnlyOne = packets.Count == 1; // (!CheckedKanbans.Any()) || (CheckedKanbans.Count == 1) && (CheckedKanbans.Contains(model.ID));
  379. var pktid = current != null ? current.ID : Guid.Empty; // row.Get<ManufacturingPacket, Guid>(x => x.ID);
  380. var stageid = current != null ? current.StageLink.ID : Guid.Empty; // row.Get<ManufacturingPacket, Guid>(x => x.StageLink.ID);
  381. var stageValid = current?.StageLink.IsValid() ?? false;
  382. var completed = current != null ? current.Completed : DateTime.MinValue; //row.Get<ManufacturingPacket, DateTime>(x => x.Completed);
  383. var printed = current != null
  384. ? current.BarcodePrinted
  385. : DateTime.MinValue; // row.Get<ManufacturingPacket, DateTime>(x => x.BarcodePrinted);
  386. var priority = current != null ? current.Priority : false; // row.Get<ManufacturingPacket, bool>(x => x.Priority);
  387. //bool onhold = current != null ? current.OnHold : false; // row.Get<ManufacturingPacket, bool>(x => x.OnHold);
  388. var onhold = current?.OnHold == true; // row.Get<ManufacturingPacket, bool>(x => x.OnHold);
  389. var qty = current != null ? current.Quantity : 0; //row.Get<ManufacturingPacket, int>(x => x.Quantity);
  390. var barcodetype =
  391. current != null ? current.BarcodeType : BarcodeType.None; // row.Get<ManufacturingPacket, BarcodeType>(x => x.BarcodeType);
  392. issue.Visibility = !stageValid && Security.IsAllowed<CanIssuePackets>() ? Visibility.Visible : Visibility.Collapsed;
  393. progress.Visibility = stageid.Equals(CoreUtils.FullGuid) || !stageValid ? Visibility.Collapsed : Visibility.Visible;
  394. split.Visibility = !stageValid && qty > 1 && printed.IsEmpty() && OnlyOne ? Visibility.Visible : Visibility.Collapsed;
  395. revert.Visibility = !stageValid && completed.Equals(DateTime.MinValue) ? Visibility.Collapsed : Visibility.Visible;
  396. cancel.Visibility = !stageValid ? Visibility.Visible : Visibility.Collapsed;
  397. bHasCancel = cancel.Visibility == Visibility.Visible;
  398. complete.Visibility = stageid.Equals(CoreUtils.FullGuid) ? Visibility.Collapsed : Visibility.Visible;
  399. bHasComplete = complete.Visibility == Visibility.Visible;
  400. template.Visibility = !stageValid ? Visibility.Visible : Visibility.Collapsed;
  401. template.Items.Clear();
  402. var menus = new Dictionary<string, MenuItem>();
  403. foreach (var Factory in Data.Factories)
  404. {
  405. if (!menus.ContainsKey(Factory.Name))
  406. {
  407. menus[Factory.Name] = new MenuItem { Header = Factory.Name };
  408. template.Items.Add(menus[Factory.Name]);
  409. }
  410. var group = menus[Factory.Name];
  411. foreach (var temp in Data.Templates.Where(x => x.Factory.ID == Factory.ID).OrderBy(x => x.Code))
  412. {
  413. var item = new MenuItem
  414. {
  415. Header = string.Format("{0}: {1}", temp.Code, temp.Name),
  416. Tag = new Tuple<Guid, ManufacturingTemplate>(pktid, temp)
  417. };
  418. item.Click += ChangeTemplateClick;
  419. group.Items.Add(item);
  420. }
  421. }
  422. bHasTemplate = template.Visibility == Visibility.Visible;
  423. changedate.Visibility = stageid.Equals(CoreUtils.FullGuid) || !stageValid ? Visibility.Collapsed : Visibility.Visible;
  424. changedate_separator.Visibility = changedate.Visibility;
  425. setpriority.Visibility = priority ? Visibility.Collapsed : Visibility.Visible;
  426. clearpriority.Visibility = priority ? Visibility.Visible : Visibility.Collapsed;
  427. editissues.Visibility = Visibility.Visible;
  428. sethold.Visibility = Security.IsAllowed<CanManagePacketHolds>() && !onhold ? Visibility.Visible : Visibility.Collapsed;
  429. clearhold.Visibility = Security.IsAllowed<CanManagePacketHolds>() && onhold ? Visibility.Visible : Visibility.Collapsed;
  430. generate.Visibility = printed.IsEmpty() && barcodetype != BarcodeType.None ? Visibility.Visible : Visibility.Collapsed;
  431. reprint.Visibility = !printed.IsEmpty() ? Visibility.Visible : Visibility.Collapsed;
  432. revoke.Visibility = !printed.IsEmpty() ? Visibility.Visible : Visibility.Collapsed;
  433. bHasBarcode = generate.Visibility == Visibility.Visible || reprint.Visibility == Visibility.Visible ||
  434. revoke.Visibility == Visibility.Visible;
  435. archive.Visibility = !printed.IsEmpty() ? Visibility.Visible : Visibility.Collapsed;
  436. bHasArchive = archive.Visibility == Visibility.Visible;
  437. progress_separator.Visibility = bHasCancel || bHasTemplate || bHasBarcode || bHasArchive ? Visibility.Visible : Visibility.Collapsed;
  438. cancel_separator.Visibility = bHasCancel && (bHasComplete || bHasTemplate || bHasBarcode || bHasArchive)
  439. ? Visibility.Visible
  440. : Visibility.Collapsed;
  441. complete_separator.Visibility = bHasComplete && (bHasTemplate || bHasBarcode || bHasArchive) ? Visibility.Visible : Visibility.Collapsed;
  442. template_separator.Visibility = bHasTemplate && (bHasBarcode || bHasArchive) ? Visibility.Visible : Visibility.Collapsed;
  443. hold_separator.Visibility = bHasBarcode || bHasArchive ? Visibility.Visible : Visibility.Collapsed;
  444. barcode_separator.Visibility = bHasBarcode && bHasArchive ? Visibility.Visible : Visibility.Collapsed;
  445. }
  446. private void ChangeTemplateClick(object sender, RoutedEventArgs e)
  447. {
  448. var menu = (MenuItem)sender;
  449. var binding = (Tuple<Guid, ManufacturingTemplate>)menu.Tag;
  450. var template = binding.Item2;
  451. if (TemplateStages == null)
  452. TemplateStages = new Client<ManufacturingTemplateStage>().Load(null, new SortOrder<ManufacturingTemplateStage>(x => x.Sequence));
  453. var templatestages = TemplateStages.Where(x => x.Template.ID.Equals(template.ID));
  454. var packets = GetSelectedPackets(binding.Item1.ToString());
  455. if (!packets.Any())
  456. {
  457. MessageBox.Show("Please select a packet before continuing");
  458. return;
  459. }
  460. Progress.Show("Loading Packet Stages");
  461. Filter<ManufacturingPacketStage> stgflt = null;
  462. Filter<ManufacturingPacket> pktflt = null;
  463. foreach (var packet in packets)
  464. {
  465. stgflt = stgflt == null
  466. ? new Filter<ManufacturingPacketStage>(x => x.Parent.ID).IsEqualTo(packet.ID)
  467. : stgflt.Or(x => x.Parent.ID).IsEqualTo(packet.ID);
  468. pktflt = pktflt == null ? new Filter<ManufacturingPacket>(x => x.ID).IsEqualTo(packet.ID) : pktflt.Or(x => x.ID).IsEqualTo(packet.ID);
  469. }
  470. var packetstages = new Client<ManufacturingPacketStage>().Load(stgflt).ToList();
  471. foreach (var packetstage in packetstages)
  472. new Client<ManufacturingPacketStage>().Delete(packetstage, "");
  473. packetstages.Clear();
  474. var pkts = new Client<ManufacturingPacket>().Load(pktflt);
  475. foreach (var packet in pkts)
  476. {
  477. packet.ManufacturingTemplateLink.ID = template.ID;
  478. packet.ManufacturingTemplateLink.Code = template.Code;
  479. packet.Group = template.Factory.Name;
  480. var attributes = new Dictionary<string, string>();
  481. //if (packet.CustomAttributes == null)
  482. // packet.CustomAttributes = new PackableList<CoreAttribute>();
  483. //foreach (var attribute in packet.CustomAttributes)
  484. // attributes[attribute.Name] = attribute.Value;
  485. //packet.CustomAttributes.Clear();
  486. //if (template.CustomAttributes != null)
  487. // packet.CustomAttributes.AddRange(template.CustomAttributes);
  488. //foreach (var attribute in packet.CustomAttributes)
  489. //{
  490. // if (attributes.ContainsKey(attribute.Name))
  491. // attribute.Value = attributes[attribute.Name];
  492. //}
  493. packet.StageLink.ID = Guid.Empty;
  494. foreach (var templatestage in templatestages)
  495. {
  496. var packetstage = new ManufacturingPacketStage
  497. {
  498. Time = templatestage.Time,
  499. Sequence = templatestage.Sequence,
  500. SequenceType = templatestage.SequenceType,
  501. Started = DateTime.MinValue,
  502. PercentageComplete = 0.0F,
  503. Completed = DateTime.MinValue,
  504. QualityChecks = templatestage.QualityChecks,
  505. QualityStatus = QualityStatus.NotChecked,
  506. QualityNotes = ""
  507. };
  508. packetstage.ManufacturingSectionLink.ID = templatestage.Section.ID;
  509. packetstage.ManufacturingSectionLink.Name = templatestage.Section.Name;
  510. packetstage.Parent.ID = packet.ID;
  511. packetstages.Add(packetstage);
  512. }
  513. }
  514. if (packetstages.Any())
  515. {
  516. Progress.SetMessage("Updating Packets");
  517. new Client<ManufacturingPacket>().Save(pkts, "Packet Template changed by User");
  518. new Client<ManufacturingPacketStage>().Save(packetstages, "Packet Template changed by User");
  519. OnChanged?.Invoke(this, new EventArgs());
  520. }
  521. Progress.Close();
  522. }
  523. private void ViewSetout_Click(object sender, RoutedEventArgs e)
  524. {
  525. var item = (MenuItem)sender;
  526. var model = (ManufacturingKanban)item.Tag;
  527. var pkt = Packets.Where(r => r.ID.ToString().Equals(model.ID)).FirstOrDefault();
  528. if (pkt == null)
  529. {
  530. MessageBox.Show("Cannot find selected Manufacturing Packet!");
  531. return;
  532. }
  533. var id = pkt.ID;
  534. pg ??= new DynamicDataGrid<ManufacturingPacket>();
  535. ManufacturingPacket? editPacket = null;
  536. using (new WaitCursor())
  537. {
  538. var columns = pg.LoadEditorColumns();
  539. editPacket = new Client<ManufacturingPacket>()
  540. .Query(
  541. new Filter<ManufacturingPacket>(x => x.ID).IsEqualTo(id),
  542. columns)
  543. .Rows.FirstOrDefault()?.ToObject<ManufacturingPacket>();
  544. }
  545. if (editPacket == null)
  546. {
  547. MessageBox.Show("Unable to load packet from database");
  548. return;
  549. }
  550. if (pg.EditItems(new[] { editPacket }))
  551. OnChanged?.Invoke(this, new EventArgs());
  552. }
  553. private void IssueSetout_Click(object sender, RoutedEventArgs e)
  554. {
  555. var item = (MenuItem)sender;
  556. var model = (ManufacturingKanban)item.Tag;
  557. var date = model.DueDate.IsEmpty() ? DateTime.Today.AddDays(14) : model.DueDate;
  558. if (DateEdit.Execute("Required Completion Date", ref date))
  559. ProgressPacket(model, date);
  560. }
  561. private void ProgressSetout_Click(object sender, RoutedEventArgs e)
  562. {
  563. var item = (MenuItem)sender;
  564. var model = (ManufacturingKanban)item.Tag;
  565. ProgressPacket(model, null);
  566. }
  567. private void ProgressPacket(ManufacturingKanban model, DateTime? date)
  568. {
  569. Progress.Show("");
  570. var pkts = GetSelectedPackets(model.ID).ToList();
  571. Progress.SetMessage("Loading Stages");
  572. Filter<ManufacturingPacketStage>? stgflt = null;
  573. foreach (var pkt in pkts)
  574. stgflt = stgflt == null
  575. ? new Filter<ManufacturingPacketStage>(x => x.Parent.ID).IsEqualTo(pkt.ID)
  576. : stgflt.Or(x => x.Parent.ID).IsEqualTo(pkt.ID);
  577. var stgs = new Client<ManufacturingPacketStage>().Load(stgflt, new SortOrder<ManufacturingPacketStage>(x => x.Sequence));
  578. ManufacturingPacket.Progress(pkts, stgs);
  579. Progress.SetMessage("Progressing Items");
  580. var stgupdate = stgs.Where(x => x.IsChanged()).ToArray();
  581. Logger.Send(LogType.Information, ClientFactory.UserID,
  582. string.Format("ManufacturingPanelColumn.ProgressPacket() - Updating [{0}] stages", stgupdate.Length));
  583. new Client<ManufacturingPacketStage>().Save(stgupdate, "ManufacturingPacket Progressed by Menu Click");
  584. var pktupdate = pkts; //.Where(x => x.IsChanged()).ToArray();
  585. if (date.HasValue)
  586. foreach (var pkt in pktupdate)
  587. pkt.DueDate = date.Value;
  588. Logger.Send(LogType.Information, ClientFactory.UserID,
  589. string.Format("ManufacturingPanelColumn.ProgressPacket() - Updating [{0}] packets: {1}", pktupdate.Count,
  590. string.Join(", ", pktupdate.Select(x => x.Serial))));
  591. new Client<ManufacturingPacket>().Save(pktupdate, "ManufacturingPacket Progressed by Menu Click");
  592. Progress.Close();
  593. ClearSelectedKanbans();
  594. //CheckedKanbans.Clear();
  595. OnChanged?.Invoke(this, new EventArgs());
  596. }
  597. private void SplitSetout_Click(object sender, RoutedEventArgs e)
  598. {
  599. var item = (MenuItem)sender;
  600. var model = (ManufacturingKanban)item.Tag;
  601. var pkts = GetSelectedPackets(model.ID).ToList();
  602. if (pkts.Count != 1)
  603. {
  604. MessageBox.Show("You can only split one Packet at a time!");
  605. return;
  606. }
  607. var pkt = pkts.First();
  608. var packets = new List<ManufacturingPacket> { pkt };
  609. var Quantity = 1;
  610. if (NumberEdit.Execute("Quantity to Issue", 1, pkt.Quantity, ref Quantity))
  611. {
  612. if (Quantity != pkt.Quantity)
  613. {
  614. var packet2 = CoreUtils.Clone(pkt, null);
  615. packet2.ID = Guid.Empty;
  616. packet2.Quantity = Quantity;
  617. pkt.Quantity -= Quantity;
  618. packets.Add(packet2);
  619. }
  620. new Client<ManufacturingPacket>().Save(packets, "Split Manufacturing Packet");
  621. var stages = new Client<ManufacturingPacketStage>().Load(
  622. new Filter<ManufacturingPacketStage>(x => x.Parent.ID).IsEqualTo(pkt.ID));
  623. foreach (var stage in stages)
  624. {
  625. stage.ID = Guid.Empty;
  626. stage.Parent.ID = pkt.ID;
  627. }
  628. new Client<ManufacturingPacketStage>().Save(stages, "");
  629. OnChanged?.Invoke(this, new EventArgs());
  630. }
  631. }
  632. private void RevertSetout_Click(object sender, RoutedEventArgs e)
  633. {
  634. var item = (MenuItem)sender;
  635. var model = (ManufacturingKanban)item.Tag;
  636. Progress.Show("");
  637. var pkts = GetSelectedPackets(model.ID).ToList();
  638. Filter<ManufacturingPacketStage>? stgflt = null;
  639. foreach (var pkt in pkts)
  640. stgflt = stgflt == null
  641. ? new Filter<ManufacturingPacketStage>(x => x.Parent.ID).IsEqualTo(pkt.ID)
  642. : stgflt.Or(x => x.Parent.ID).IsEqualTo(pkt.ID);
  643. var stgs = new Client<ManufacturingPacketStage>().Load(stgflt, new SortOrder<ManufacturingPacketStage>(x => x.Sequence));
  644. ManufacturingPacket.Regress(pkts, stgs);
  645. Progress.SetMessage("Regressing Items");
  646. new Client<ManufacturingPacketStage>().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Regressed by Menu Click");
  647. new Client<ManufacturingPacket>().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Regressed by Menu Click");
  648. ClearSelectedKanbans();
  649. //CheckedKanbans.Clear();
  650. Progress.Close();
  651. OnChanged?.Invoke(this, new EventArgs());
  652. }
  653. private void CancelSetout_Click(object sender, RoutedEventArgs e)
  654. {
  655. if (MessageBox.Show(
  656. "This will cancel the selected packet (and any associated barcodes) and remove it from view.\n\nAre you sure you wish to continue?",
  657. "Confirm packet cancellation", MessageBoxButton.YesNo).Equals(MessageBoxResult.Yes))
  658. {
  659. var item = (MenuItem)sender;
  660. var model = (ManufacturingKanban)item.Tag;
  661. Progress.Show("");
  662. var pkts = GetSelectedPackets(model.ID);
  663. var updates = new List<ManufacturingPacket>();
  664. foreach (var packet in pkts)
  665. {
  666. packet.BarcodePrinted = DateTime.MinValue;
  667. packet.Archived = DateTime.Now;
  668. updates.Add(packet);
  669. }
  670. Progress.SetMessage("Archiving Packets");
  671. new Client<ManufacturingPacket>().Save(updates, "ManufacturingPacket Cancelled by Menu Click");
  672. ClearSelectedKanbans();
  673. //CheckedKanbans.Clear();
  674. Progress.Close();
  675. OnChanged?.Invoke(this, new EventArgs());
  676. }
  677. }
  678. private void CompeteItem_Click(object sender, RoutedEventArgs e)
  679. {
  680. var item = (MenuItem)sender;
  681. var model = (ManufacturingKanban)item.Tag;
  682. Progress.Show("");
  683. var pkts = GetSelectedPackets(model.ID);
  684. Progress.SetMessage("Loading Stages");
  685. Filter<ManufacturingPacketStage>? stgflt = null;
  686. foreach (var pkt in pkts)
  687. stgflt = stgflt == null
  688. ? new Filter<ManufacturingPacketStage>(x => x.Parent.ID).IsEqualTo(pkt.ID)
  689. : stgflt.Or(x => x.Parent.ID).IsEqualTo(pkt.ID);
  690. var stgs = new Client<ManufacturingPacketStage>().Query(
  691. stgflt,
  692. new Columns<ManufacturingPacketStage>(x => x.ID)
  693. .Add(x => x.Parent.ID)
  694. .Add(x => x.Sequence),
  695. new SortOrder<ManufacturingPacketStage>(x => x.Sequence)
  696. ).Rows.Select(x => x.ToObject<ManufacturingPacketStage>()).ToArray();
  697. while (pkts.Any(x => x.Completed.IsEmpty())) ManufacturingPacket.Progress(pkts, stgs);
  698. Progress.SetMessage("Progressing Items");
  699. new Client<ManufacturingPacketStage>().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
  700. new Client<ManufacturingPacket>().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
  701. Progress.Close();
  702. ClearSelectedKanbans();
  703. //CheckedKanbans.Clear();
  704. OnChanged?.Invoke(this, new EventArgs());
  705. }
  706. private void ChangeDate_Click(object sender, RoutedEventArgs e)
  707. {
  708. var item = (MenuItem)sender;
  709. var model = (ManufacturingKanban)item.Tag;
  710. var pkts = GetSelectedPackets(model.ID);
  711. DateTime? date = null;
  712. foreach (var pkt in pkts)
  713. if (!date.HasValue)
  714. date = pkt.DueDate;
  715. else if (!date.Value.Equals(pkt.DueDate))
  716. date = date > pkt.DueDate ? date : pkt.DueDate;
  717. var date2 = date ?? DateTime.Today.AddDays(14) ;
  718. if (DateEdit.Execute("Required Completion Date", ref date2))
  719. {
  720. Progress.SetMessage("Updating Packets");
  721. foreach (var pkt in pkts)
  722. pkt.DueDate = date2;
  723. new Client<ManufacturingPacket>().Save(pkts, string.Format("Changed Due Date To {0:dd MMM yy}", date2));
  724. ClearSelectedKanbans();
  725. //CheckedKanbans.Clear();
  726. Progress.Close();
  727. OnChanged?.Invoke(this, new EventArgs());
  728. }
  729. }
  730. private void UpdatePriority(object sender, bool priority)
  731. {
  732. var item = (MenuItem)sender;
  733. var model = (ManufacturingKanban)item.Tag;
  734. Progress.Show("");
  735. var pkts = GetSelectedPackets(model.ID).ToList();
  736. foreach(var packet in pkts)
  737. {
  738. packet.Priority = priority;
  739. }
  740. Logger.Send(LogType.Information, ClientFactory.UserID,
  741. string.Format("ManufacturingPanelColumn.UpdatePriority() - Updating [{0}] packets: {1}", pkts.Count,
  742. string.Join(", ", pkts.Select(x => x.Serial))));
  743. Progress.SetMessage("Updating Packets");
  744. new Client<ManufacturingPacket>().Save(pkts, "Priority Flag " + (priority ? "Set" : "Cleared"));
  745. ClearSelectedKanbans();
  746. //CheckedKanbans.Clear();
  747. Progress.Close();
  748. OnChanged?.Invoke(this, new EventArgs());
  749. }
  750. private void SetPriority_Click(object sender, RoutedEventArgs e)
  751. {
  752. UpdatePriority(sender, true);
  753. }
  754. private void ClearPriority_Click(object sender, RoutedEventArgs e)
  755. {
  756. UpdatePriority(sender, false);
  757. }
  758. private void UpdateHold(object sender, bool hold)
  759. {
  760. var item = (MenuItem)sender;
  761. var model = (ManufacturingKanban)item.Tag;
  762. if (MessageBox.Show(
  763. hold
  764. ? "Are you sure you want to place a hold on this packet?"
  765. : "Are you sure you want to release this packet from hold?",
  766. hold
  767. ? "Confirm Hold"
  768. : "Confirm Release",
  769. MessageBoxButton.YesNo,
  770. MessageBoxImage.Question
  771. ) != MessageBoxResult.Yes
  772. )
  773. return;
  774. Progress.ShowModal("Updating Hold Flags", (Action<IProgress<string>>)(progress =>
  775. {
  776. var pkts = GetSelectedPackets(model.ID).Select(x =>
  777. {
  778. x.OnHold = hold;
  779. return x;
  780. });
  781. progress.Report("Updating Packets");
  782. new Client<ManufacturingPacket>().Save(pkts, "Hold Flag " + (hold ? "Set" : "Cleared"));
  783. }));
  784. ClearSelectedKanbans();
  785. OnChanged?.Invoke(this, new EventArgs());
  786. }
  787. private void EditIssues_Click(object sender, RoutedEventArgs e)
  788. {
  789. var item = (MenuItem)sender;
  790. var model = (ManufacturingKanban)item.Tag;
  791. var pkts = GetSelectedPackets(model.ID).ToArray();
  792. if (new DynamicIssuesEditor(pkts, true).ShowDialog() == true)
  793. {
  794. Progress.ShowModal("Updating Issues", progress => { new Client<ManufacturingPacket>().Save(pkts, "Updated Issues"); });
  795. ClearSelectedKanbans();
  796. OnChanged?.Invoke(this, new EventArgs());
  797. }
  798. }
  799. private void SetHold_Click(object sender, RoutedEventArgs e)
  800. {
  801. UpdateHold(sender, true);
  802. }
  803. private void ClearHold_Click(object sender, RoutedEventArgs e)
  804. {
  805. UpdateHold(sender, false);
  806. }
  807. private void PrintBarcodes(IEnumerable<ManufacturingPacket> pkts)
  808. {
  809. //Filter<DeliveryItem> filter = null;
  810. //foreach (var pkt in pkts)
  811. //{
  812. // if (filter == null)
  813. // filter = new Filter<DeliveryItem>(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID);
  814. // else
  815. // filter.Ors.Add(new Filter<DeliveryItem>(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID));
  816. //}
  817. //Dictionary<Type, CoreTable> dataenvironment = new Dictionary<Type, CoreTable>();
  818. //Client<DeliveryItem> delclient = new Client<DeliveryItem>();
  819. //CoreTable items = delclient.Query(
  820. // filter,
  821. // null,
  822. // //new Columns<DeliveryItem>(
  823. // // x => x.ID,
  824. // // x => x.Barcode,
  825. // // x => x.SetoutLink.Reference,
  826. // // x => x.SetoutLink.Location,
  827. // // x => x.SetoutLink.JobLink.JobNumber,
  828. // // x => x.SetoutLink.JobLink.Name,
  829. // // x => x.ManufacturingPacketLink.Serial,
  830. // // x => x.Description,
  831. // // x => x.Attributes
  832. // //),
  833. // new SortOrder<DeliveryItem>(x => x.Sequence)
  834. //);
  835. //dataenvironment[typeof(DeliveryItem)] = items;
  836. var ids = pkts.Select(x => x.ID).ToArray();
  837. var datamodel = new DeliveryItemDataModel(new Filter<DeliveryItem>(x => x.ManufacturingPacketLink.ID).InList(ids));
  838. var repclient = new Client<ReportTemplate>();
  839. var ReportName = "Print Bar Codes" + (!string.IsNullOrWhiteSpace(pkts.First().Group) ? " - " + pkts.First().Group : "");
  840. var report = repclient.Load(new Filter<ReportTemplate>(x => x.DataModel).IsEqualTo(datamodel.Name).And(x => x.Name).IsEqualTo(ReportName))
  841. .FirstOrDefault();
  842. if (report == null)
  843. {
  844. ReportName = "Print Bar Codes";
  845. report = repclient.Load(new Filter<ReportTemplate>(x => x.DataModel).IsEqualTo(datamodel.Name).And(x => x.Name).IsEqualTo(ReportName))
  846. .FirstOrDefault();
  847. }
  848. if (report == null)
  849. {
  850. MessageBox.Show(string.Format("{0} -> [{1}] report does not exist!", datamodel.Name, ReportName));
  851. return;
  852. }
  853. ReportUtils.PreviewReport(report, datamodel, false, Security.IsAllowed<CanDesignReports>());
  854. }
  855. private void GenerateBarcodes_Click(object sender, RoutedEventArgs e)
  856. {
  857. var item = (MenuItem)sender;
  858. var model = (ManufacturingKanban)item.Tag;
  859. Progress.Show("");
  860. var pkts = GetSelectedPackets(model.ID).Where(x => x.BarcodePrinted.IsEmpty() && x.BarcodeType != BarcodeType.None).ToArray();
  861. if (!pkts.Any())
  862. {
  863. MessageBox.Show("Please select a packet before continuing");
  864. return;
  865. }
  866. Filter<ManufacturingPacket> pktflt = null;
  867. foreach (var packet in pkts)
  868. pktflt = pktflt == null ? new Filter<ManufacturingPacket>(x => x.ID).IsEqualTo(packet.ID) : pktflt.Or(x => x.ID).IsEqualTo(packet.ID);
  869. pkts = new Client<ManufacturingPacket>().Load(pktflt);
  870. for (var i = 0; i < pkts.Length; i++)
  871. {
  872. var packet = pkts[i];
  873. packet.BarcodePrinted = DateTime.Now;
  874. }
  875. Progress.SetMessage("Creating Barcodes");
  876. Logger.Send(LogType.Information, ClientFactory.UserID,
  877. string.Format("ManufacturingPanelColumn.GenerateBarcodes() - Updating [{0}] packets: {1}", pkts.Length,
  878. string.Join(", ", pkts.Select(x => x.Serial))));
  879. new Client<ManufacturingPacket>().Save(pkts, "Delivery Barcodes created");
  880. ClearSelectedKanbans();
  881. //CheckedKanbans.Clear();
  882. Progress.Close();
  883. PrintBarcodes(pkts);
  884. OnChanged?.Invoke(this, new EventArgs());
  885. }
  886. private void ReprintBarcodes_Click(object sender, RoutedEventArgs e)
  887. {
  888. var item = (MenuItem)sender;
  889. var model = (ManufacturingKanban)item.Tag;
  890. var pkts = GetSelectedPackets(model.ID);
  891. PrintBarcodes(pkts.Where(x => !x.BarcodePrinted.IsEmpty()));
  892. }
  893. private void RevokeBarcodes_Click(object sender, RoutedEventArgs e)
  894. {
  895. if (MessageBox.Show("This will clear out any delivery items already assigned to racks!\n\nAre you sure you wish to continue?",
  896. "Confirm revocation", MessageBoxButton.YesNo).Equals(MessageBoxResult.Yes))
  897. {
  898. var item = (MenuItem)sender;
  899. var model = (ManufacturingKanban)item.Tag;
  900. Progress.Show("");
  901. var pkts = GetSelectedPackets(model.ID).Where(x => !x.BarcodePrinted.IsEmpty()).ToArray();
  902. for (var i = 0; i < pkts.Length; i++)
  903. {
  904. Progress.SetMessage(string.Format("Revoking: {0:F2}% complete", (double)i * 100.0F / pkts.Length));
  905. var packet = pkts[i];
  906. packet.BarcodePrinted = DateTime.MinValue;
  907. }
  908. Progress.SetMessage("Revoking Barcodes");
  909. new Client<ManufacturingPacket>().Save(pkts, "Delivery Barcodes revoked");
  910. ClearSelectedKanbans();
  911. //CheckedKanbans.Clear();
  912. Progress.Close();
  913. OnChanged?.Invoke(this, new EventArgs());
  914. }
  915. }
  916. private void ArchiveSetout_Click(object sender, RoutedEventArgs e)
  917. {
  918. if (MessageBox.Show("This will remove the selected packet from view.\n\nAre you sure you wish to continue?", "Confirm item completion",
  919. MessageBoxButton.YesNo).Equals(MessageBoxResult.Yes))
  920. {
  921. var item = (MenuItem)sender;
  922. var model = (ManufacturingKanban)item.Tag;
  923. Progress.Show("");
  924. var updates = new List<ManufacturingPacket>();
  925. foreach(var packet in GetSelectedPackets(model.ID))
  926. {
  927. if (!packet.BarcodePrinted.IsEmpty())
  928. {
  929. //while (packet.Completed.IsEmpty())
  930. // packet.MoveNext();
  931. packet.Archived = DateTime.Now;
  932. updates.Add(packet);
  933. }
  934. }
  935. Progress.SetMessage("Archiving Items");
  936. new Client<ManufacturingPacket>().Save(updates, "ManufacturingPacket Archived by Menu Click");
  937. ClearSelectedKanbans();
  938. //CheckedKanbans.Clear();
  939. Progress.Close();
  940. OnChanged?.Invoke(this, new EventArgs());
  941. }
  942. }
  943. private void SelectAll_Click(object sender, RoutedEventArgs e)
  944. {
  945. //CheckedKanbans.Clear();
  946. foreach (var kanban in Kanbans)
  947. kanban.Checked = true;
  948. var tmp = Kanbans;
  949. Items.ItemsSource = null;
  950. Items.ItemsSource = tmp;
  951. }
  952. private void ClearAll_Click(object sender, RoutedEventArgs e)
  953. {
  954. ClearSelectedKanbans();
  955. //CheckedKanbans.Clear();
  956. //foreach (var kanban in Kanbans)
  957. //{
  958. // kanban.Checked = false;
  959. // CheckedKanbans.Add(kanban.ID);
  960. //}
  961. var tmp = Kanbans;
  962. Items.ItemsSource = null;
  963. Items.ItemsSource = tmp;
  964. }
  965. private void ExpandColumn_Click(object sender, MouseButtonEventArgs e)
  966. {
  967. Collapsed = false;
  968. }
  969. private void CollapseColumn_Click(object sender, MouseButtonEventArgs e)
  970. {
  971. Collapsed = true;
  972. }
  973. private void Template_MouseEnter(object sender, MouseEventArgs e)
  974. {
  975. }
  976. private void Template_MouseLeave(object sender, MouseEventArgs e)
  977. {
  978. }
  979. private void ToolTip_Opened(object sender, RoutedEventArgs e)
  980. {
  981. if (sender.GetType().FullName.Equals(
  982. "System.Windows.Controls.ToolTip"))
  983. {
  984. ToolTip t = (ToolTip)sender;
  985. Dispatcher.Invoke(() =>
  986. {
  987. t.Content = new TextBlock { Text = "Loading..." };
  988. });
  989. ManufacturingKanban kanban = t.DataContext as ManufacturingKanban;
  990. Task.Run(() =>
  991. {
  992. string s = "";
  993. int count = 1;
  994. var list = templateStages.Where(x => x.TemplateID == kanban.TemplateID);
  995. foreach (var stage in list)
  996. {
  997. if (count > 1)
  998. s = s + System.Environment.NewLine;
  999. s = s + count + ". " + stage.Name + " (" + stage.Time + ")";
  1000. count++;
  1001. }
  1002. Dispatcher.Invoke(() =>
  1003. {
  1004. t.Content = new TextBlock { Text = s };
  1005. });
  1006. });
  1007. }
  1008. }
  1009. }
  1010. }