ManufacturingPanelColumn.xaml.cs 58 KB

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