ManufacturingPanelColumn.xaml.cs 51 KB

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