ManufacturingPanelColumn.xaml.cs 51 KB

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