ManufacturingPanel.xaml.cs 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Input;
  8. using System.Windows.Media.Imaging;
  9. using System.Windows.Threading;
  10. using Comal.Classes;
  11. using InABox.Clients;
  12. using InABox.Configuration;
  13. using InABox.Core;
  14. using InABox.DynamicGrid;
  15. using InABox.WPF;
  16. using Syncfusion.UI.Xaml.Kanban;
  17. namespace PRSDesktop
  18. {
  19. public partial class ManufacturingPanel : UserControl, IPanel<ManufacturingPacket>
  20. {
  21. private readonly List<ManufacturingPanelColumn> _columns = new();
  22. private readonly BitmapImage barcode = PRSDesktop.Resources.barcode.AsBitmapImage();
  23. private bool bIncludeCompleted;
  24. private bool bIncludeHeld;
  25. private bool bIncludeOrders;
  26. private readonly DispatcherTimer columnsizer = new();
  27. private bool CompactView;
  28. private bool ConsolidatedView;
  29. private Guid CurrentFactory = Guid.Empty;
  30. public KanbanModel CurrentKanban = null;
  31. private readonly BitmapImage disabled = PRSDesktop.Resources.disabled.AsBitmapImage();
  32. private ManufacturingFactory[] Factories = { };
  33. private Document[] FactoryImages = { };
  34. private int iCombo;
  35. private CoreTable ITPs;
  36. private bool JobChanging;
  37. private CoreTable Jobs;
  38. private readonly List<Tuple<Guid, DateTime, string>> OrderItems = new();
  39. private CoreTable packets;
  40. private ManufacturingSection[] Sections = { };
  41. private ManufacturingSettings settings = new();
  42. //ManufacturingTemplateStage[] TemplateStages = null;
  43. private bool SortByDueDate = true;
  44. private readonly BitmapImage speechbubble = PRSDesktop.Resources.speechbubble.AsBitmapImage();
  45. private ManufacturingTemplate[] Templates = { };
  46. public ManufacturingPanel()
  47. {
  48. InitializeComponent();
  49. //columnsizer.Interval = new TimeSpan(0, 0, 0, 0, 500);
  50. //columnsizer.Tick += Columnsizer_Tick;
  51. //columnsizer.IsEnabled = true;
  52. IncludeCompleted.IsChecked = false;
  53. }
  54. //public List<String> CheckedKanbans = new List<string>();
  55. public ObservableCollection<ManufacturingKanban> Kanbans { get; set; }
  56. public bool IsReady { get; set; }
  57. public Dictionary<string, object[]> Selected()
  58. {
  59. return new Dictionary<string, object[]> { { typeof(ManufacturingPacket).EntityName(), new CoreRow[] { } } };
  60. }
  61. public void Setup()
  62. {
  63. settings = new UserConfiguration<ManufacturingSettings>().Load();
  64. var FactorySource = new ObservableCollection<Tuple<string, BitmapImage, Guid>>();
  65. FactorySource.Add(new Tuple<string, BitmapImage, Guid>("All Sections", PRSDesktop.Resources.factory.AsBitmapImage(), Guid.Empty));
  66. var tables = ClientFactory.MultiQuery(
  67. new QueryDef<ManufacturingFactory>(null, null, null),
  68. new QueryDef<ManufacturingSection>(null, null, null),
  69. new QueryDef<ManufacturingTemplate>(null, null, null),
  70. new QueryDef<Job>(
  71. LookupFactory.DefineFilter<Job>(),
  72. new Columns<Job>(
  73. x => x.ID,
  74. x => x.JobNumber,
  75. x => x.Name
  76. ),
  77. LookupFactory.DefineSort<Job>()
  78. ),
  79. new QueryDef<JobITP>(null, null, null),
  80. new QueryDef<PurchaseOrderItem>(
  81. new Filter<PurchaseOrderItem>(x => x.Packet).LinkValid()
  82. .And(x => x.Packet.Completed).IsEqualTo(DateTime.MinValue),
  83. new Columns<PurchaseOrderItem>(
  84. x => x.ID,
  85. x => x.ReceivedDate,
  86. x => x.Consignment.EstimatedWarehouseArrival,
  87. x => x.DueDate,
  88. x => x.PurchaseOrderLink.SupplierLink.Code,
  89. x => x.PurchaseOrderLink.PONumber,
  90. x => x.ReceivedReference
  91. ),
  92. null
  93. )
  94. );
  95. Factories = tables[0].Rows.Select(x => x.ToObject<ManufacturingFactory>())
  96. .ToArray(); //new Client<ManufacturingFactory>().Load(null, new SortOrder<ManufacturingFactory>(x=>x.Sequence));
  97. Sections = tables[1].Rows.Select(x => x.ToObject<ManufacturingSection>())
  98. .ToArray(); //new Client<ManufacturingSection>().Load(null, new SortOrder<ManufacturingSection>(x=>x.Sequence));
  99. Templates = tables[2].Rows.Select(x => x.ToObject<ManufacturingTemplate>())
  100. .ToArray(); //new Client<ManufacturingTemplate>().Load(null, new SortOrder<ManufacturingTemplate>(x=>x.Code));
  101. Jobs = tables[3]; //.Rows.Select(x => x.ToObject<Job>()).ToArray();
  102. ITPs = tables[4]; //.Rows.Select(x => x.ToObject<JobITP>()).ToArray();
  103. foreach (var orderrow in tables[5].Rows)
  104. {
  105. var id = orderrow.Get<PurchaseOrderItem, Guid>(x => x.ID);
  106. var receiveddate = orderrow.Get<PurchaseOrderItem, DateTime>(c => c.ReceivedDate);
  107. var estimatedwarehousearrival = orderrow.Get<PurchaseOrderItem, DateTime>(c => c.Consignment.EstimatedWarehouseArrival);
  108. if (estimatedwarehousearrival.IsEmpty())
  109. estimatedwarehousearrival = orderrow.Get<PurchaseOrderItem, DateTime>(c => c.DueDate);
  110. var suppliercode = orderrow.Get<PurchaseOrderItem, string>(c => c.PurchaseOrderLink.SupplierLink.Code);
  111. var ponumber = orderrow.Get<PurchaseOrderItem, string>(c => c.PurchaseOrderLink.PONumber);
  112. var poreference = orderrow.Get<PurchaseOrderItem, string>(c => c.ReceivedReference);
  113. var tag = receiveddate.IsEmpty() ? "ETA" : "RCVD";
  114. OrderItems.Add(new Tuple<Guid, DateTime, string>(
  115. id,
  116. receiveddate,
  117. string.Format("{0} ({1}) {2} {3:dd MMM yy} {4}",
  118. suppliercode,
  119. ponumber,
  120. tag,
  121. receiveddate.IsEmpty() ? estimatedwarehousearrival : receiveddate,
  122. string.IsNullOrWhiteSpace(poreference) ? "" : ": " + poreference
  123. )
  124. ));
  125. }
  126. //OrderItems = tables[5]; //.Rows.Select(x => x.ToObject<PurchaseOrderItem>()).ToArray();
  127. Filter<Document> imageFilter = null;
  128. foreach (var Factory in Factories)
  129. if (Factory.Thumbnail.IsValid())
  130. imageFilter = imageFilter == null
  131. ? new Filter<Document>(x => x.ID).IsEqualTo(Factory.Thumbnail.ID)
  132. : imageFilter.Or(x => x.ID).IsEqualTo(Factory.Thumbnail.ID);
  133. FactoryImages = new Client<Document>().Load(imageFilter);
  134. var iFact = 1;
  135. foreach (var Factory in Factories)
  136. {
  137. var groups = new List<string>();
  138. if (!FactorySource.Any(x => x.Item1.Equals(Factory.Name)))
  139. {
  140. var image = FactoryImages.FirstOrDefault(x => x.ID.Equals(Factory.Thumbnail.ID));
  141. BitmapImage img = null;
  142. if (image != null && image.Data != null && image.Data.Length > 0)
  143. {
  144. img = new BitmapImage();
  145. img.LoadImage(image.Data);
  146. }
  147. else
  148. {
  149. img = PRSDesktop.Resources.factory.AsBitmapImage();
  150. }
  151. FactorySource.Add(new Tuple<string, BitmapImage, Guid>(Factory.Name, img, Factory.ID));
  152. if (settings.FactoryID == Factory.ID)
  153. iFact = FactorySource.Count - 1;
  154. }
  155. }
  156. FactoryListBox.ItemsSource = FactorySource;
  157. FactoryListBox.SelectedIndex = iFact < FactorySource.Count ? iFact : 0;
  158. SortBy.SelectedIndex = settings.SortByDueDate ? 1 : 0;
  159. View.SelectedIndex = settings.CompactView ? 1 : 0;
  160. bIncludeHeld = settings.IncludeHeld;
  161. IncludeHeld.IsChecked = bIncludeHeld;
  162. bIncludeOrders = settings.IncludeOrders;
  163. IncludeOrders.IsChecked = bIncludeOrders;
  164. bIncludeCompleted = settings.IncludeCompleted;
  165. IncludeCompleted.IsChecked = bIncludeCompleted;
  166. //new Client<Job>().Query(
  167. // LookupFactory.DefineFilter<Job>(),
  168. // LookupFactory.DefineColumns<Job>(),
  169. // LookupFactory.DefineSort<Job>(),
  170. // (table, error) =>
  171. // {
  172. // Dictionary<Guid, String> jobs = new Dictionary<Guid, string>() { { CoreUtils.FullGuid, "All Jobs" } };
  173. // foreach (var row in table.Rows)
  174. // jobs[row.Get<Job, Guid>(x => x.ID)] = String.Format("{0}: {1}", row.Get<Job, String>(x => x.JobNumber), row.Get<Job, String>(x => x.Name));
  175. // Dispatcher.Invoke(() =>
  176. // {
  177. // JobChanging = true;
  178. // Job.ItemsSource = jobs;
  179. // Job.SelectedValue = CoreUtils.FullGuid;
  180. // //Level.IsEnabled = false;
  181. // //Zone.IsEnabled = false;
  182. // ITP.IsEnabled = false;
  183. // JobChanging = false;
  184. // });
  185. // });
  186. var jobs = new Dictionary<Guid, string> { { CoreUtils.FullGuid, "All Jobs" } };
  187. foreach (var row in Jobs.Rows)
  188. jobs[row.Get<Job, Guid>(c => c.ID)] =
  189. string.Format("{0}: {1}", row.Get<Job, string>(c => c.JobNumber), row.Get<Job, string>(c => c.Name));
  190. JobChanging = true;
  191. Job.ItemsSource = jobs;
  192. Job.SelectedValue = CoreUtils.FullGuid;
  193. ITP.IsEnabled = false;
  194. JobChanging = false;
  195. }
  196. public void Shutdown()
  197. {
  198. }
  199. public void CreateToolbarButtons(IPanelHost host)
  200. {
  201. }
  202. public string SectionName => "Manufacturing Packets";
  203. public DataModel DataModel(Selection selection)
  204. {
  205. var ids = new List<Guid>();
  206. foreach (var column in _columns)
  207. {
  208. var rows = selection == Selection.None
  209. ? new CoreRow[] { }
  210. : selection == Selection.Selected
  211. ? column.GetSelectedRows(Guid.Empty.ToString())
  212. : column.packets.Rows;
  213. ids.AddRange(rows.Select(r => r.Get<ManufacturingPacket, Guid>(c => c.ID)));
  214. }
  215. return new ManufacturingPacketDataModel(new Filter<ManufacturingPacket>(x => x.ID).InList(ids.ToArray()));
  216. }
  217. public void Refresh()
  218. {
  219. Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = Cursors.Wait; });
  220. var now = DateTime.Now;
  221. ReloadFactories();
  222. var elapsed = DateTime.Now - now;
  223. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Refreshed Factories in {0}ms", elapsed.TotalMilliseconds));
  224. now = DateTime.Now;
  225. ReloadPackets();
  226. elapsed = DateTime.Now - now;
  227. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Refreshed Packets in {0}ms", elapsed.TotalMilliseconds));
  228. Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = null; });
  229. }
  230. public event DataModelUpdateEvent OnUpdateDataModel;
  231. //private void ChangeDate_Click(object sender, RoutedEventArgs e)
  232. //{
  233. // MenuItem item = (MenuItem)sender;
  234. // KanbanModel model = (KanbanModel)item.Tag;
  235. // var pkts = GetSelectedPackets(model.ID);
  236. // DateTime? date = null;
  237. // foreach (var pkt in pkts)
  238. // {
  239. // if (!date.HasValue)
  240. // date = pkt.DueDate;
  241. // else if (!date.Value.Equals(pkt.DueDate))
  242. // date = date > pkt.DueDate ? date : pkt.DueDate;
  243. // }
  244. // DateTime date2 = !date.HasValue ? DateTime.Today.AddDays(14) : date.Value;
  245. // if (InABox.WPF.DateEdit.Execute("Required Completion Date", ref date2))
  246. // {
  247. // Progress.SetMessage("Updating Packets");
  248. // foreach (var pkt in pkts)
  249. // pkt.DueDate = date2;
  250. // new Client<ManufacturingPacket>().Save(pkts, String.Format("Changed Due Date To {0:dd MMM yy}", date2));
  251. // CheckedKanbans.Clear();
  252. // Progress.Close();
  253. // Refresh();
  254. // }
  255. //}
  256. //private void UpdatePriority(object sender, bool priority)
  257. //{
  258. // MenuItem item = (MenuItem)sender;
  259. // KanbanModel model = (KanbanModel)item.Tag;
  260. // Progress.Show("");
  261. // var pkts = GetSelectedPackets(model.ID);
  262. // for (int i = 0; i < pkts.Length; i++)
  263. // {
  264. // var packet = pkts[i];
  265. // packet.Priority = priority;
  266. // }
  267. // Progress.SetMessage("Updating Packets");
  268. // new Client<ManufacturingPacket>().Save(pkts, "Priority Flag "+ (priority ? "Set" : "Cleared"));
  269. // CheckedKanbans.Clear();
  270. // Progress.Close();
  271. // Refresh();
  272. //}
  273. //private void SetPriority_Click(object sender, RoutedEventArgs e)
  274. //{
  275. // UpdatePriority(sender, true);
  276. //}
  277. //private void ClearPriority_Click(object sender, RoutedEventArgs e)
  278. //{
  279. // UpdatePriority(sender, false);
  280. //}
  281. //private void UpdateHold(object sender, bool hold)
  282. //{
  283. // MenuItem item = (MenuItem)sender;
  284. // KanbanModel model = (KanbanModel)item.Tag;
  285. // Progress.Show("");
  286. // var pkts = GetSelectedPackets(model.ID);
  287. // for (int i = 0; i < pkts.Length; i++)
  288. // {
  289. // var packet = pkts[i];
  290. // packet.OnHold = hold;
  291. // }
  292. // Progress.SetMessage("Updating Packets");
  293. // new Client<ManufacturingPacket>().Save(pkts, "Hold Flag " + (hold ? "Set" : "Cleared"));
  294. // CheckedKanbans.Clear();
  295. // Progress.Close();
  296. // Refresh();
  297. //}
  298. //private void SetHold_Click(object sender, RoutedEventArgs e)
  299. //{
  300. // UpdateHold(sender, true);
  301. //}
  302. //private void ClearHold_Click(object sender, RoutedEventArgs e)
  303. //{
  304. // UpdateHold(sender, false);
  305. //}
  306. //private void CompeteItem_Click(object sender, RoutedEventArgs e)
  307. //{
  308. // MenuItem item = (MenuItem)sender;
  309. // KanbanModel model = (KanbanModel)item.Tag;
  310. // Progress.Show("");
  311. // var pkts = GetSelectedPackets(model.ID);
  312. // Progress.SetMessage("Loading Stages");
  313. // Filter<ManufacturingPacketStage> stgflt = null;
  314. // foreach (var pkt in pkts)
  315. // stgflt = stgflt == null ? new Filter<ManufacturingPacketStage>(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID) : stgflt.Or(x => x.ManufacturingPacketLink.ID).IsEqualTo(pkt.ID);
  316. // ManufacturingPacketStage[] stgs = new Client<ManufacturingPacketStage>().Load(stgflt, new SortOrder<ManufacturingPacketStage>(x => x.Sequence));
  317. // while (pkts.Any(x => x.Completed.IsEmpty()))
  318. // {
  319. // ManufacturingPacket.Progress(pkts, stgs);
  320. // }
  321. // Progress.SetMessage("Progressing Items");
  322. // new Client<ManufacturingPacketStage>().Save(stgs.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
  323. // new Client<ManufacturingPacket>().Save(pkts.Where(x => x.IsChanged()), "ManufacturingPacket Marked as Complete");
  324. // Progress.Close();
  325. // CheckedKanbans.Clear();
  326. // Refresh();
  327. //}
  328. public void Heartbeat(TimeSpan time)
  329. {
  330. }
  331. private void Job_SelectionChanged(object sender, SelectionChangedEventArgs e)
  332. {
  333. //Dictionary<Guid, String> Levels = new Dictionary<Guid, string>() { { CoreUtils.FullGuid, "All Levels" } };
  334. //Dictionary<Guid, String> Zones = new Dictionary<Guid, string>() { { CoreUtils.FullGuid, "All Zones" } };
  335. var itps = new Dictionary<Guid, string> { { CoreUtils.FullGuid, "All ITPs" } };
  336. if (Job.SelectedValue == null || (Guid)Job.SelectedValue == CoreUtils.FullGuid)
  337. {
  338. iCombo = 1;
  339. //Level.ItemsSource = Levels;
  340. //Level.SelectedValue = CoreUtils.FullGuid;
  341. //Level.IsEnabled = false;
  342. //Zone.ItemsSource = Zones;
  343. //Zone.SelectedValue = CoreUtils.FullGuid;
  344. //Zone.IsEnabled = false;
  345. ITP.ItemsSource = itps;
  346. ITP.SelectedValue = CoreUtils.FullGuid;
  347. ITP.IsEnabled = false;
  348. iCombo = 0;
  349. if (!JobChanging)
  350. ReloadPackets();
  351. return;
  352. }
  353. iCombo = 1;
  354. foreach (var row in ITPs.Rows.Where(r => r.Get<JobITP, Guid>(c => c.Job.ID).Equals(Job.SelectedValue)))
  355. itps[row.Get<JobITP, Guid>(c => c.Job.ID)] =
  356. string.Format("{0}: {1}", row.Get<JobITP, string>(c => c.Code), row.Get<JobITP, string>(c => c.Description));
  357. ITP.ItemsSource = itps;
  358. ITP.SelectedValue = CoreUtils.FullGuid;
  359. ITP.IsEnabled = true;
  360. iCombo--;
  361. if (iCombo == 0)
  362. ReloadPackets();
  363. //new Client<JobLevel>().Query(
  364. // new Filter<JobLevel>(x=>x.Job.ID).IsEqualTo((Guid)Job.SelectedValue),
  365. // LookupFactory.DefineColumns<JobLevel>(),
  366. // LookupFactory.DefineSort<JobLevel>(),
  367. // (table, error) =>
  368. // {
  369. // foreach (var row in table.Rows)
  370. // Levels[row.Get<JobLevel, Guid>(x => x.ID)] = String.Format("{0}: {1}", row.Get<JobLevel,String>(x=>x.Code), row.Get<JobLevel,String>(x=>x.Description));
  371. // Dispatcher.Invoke(() =>
  372. // {
  373. // Level.ItemsSource = Levels;
  374. // Level.SelectedValue = CoreUtils.FullGuid;
  375. // Level.IsEnabled = true;
  376. // iCombo--;
  377. // if (iCombo == 0)
  378. // ReloadPackets();
  379. // });
  380. // });
  381. // new Client<JobZone>().Query(
  382. // new Filter<JobZone>(x => x.Job.ID).IsEqualTo((Guid)Job.SelectedValue),
  383. // LookupFactory.DefineColumns<JobZone>(),
  384. // LookupFactory.DefineSort<JobZone>(),
  385. // (table, error) =>
  386. // {
  387. // foreach (var row in table.Rows)
  388. // Zones[row.Get<JobZone, Guid>(x => x.ID)] = String.Format("{0}: {1}", row.Get<JobZone, String>(x => x.Code), row.Get<JobZone, String>(x => x.Description));
  389. // Dispatcher.Invoke(() =>
  390. // {
  391. // Zone.ItemsSource = Zones;
  392. // Zone.SelectedValue = CoreUtils.FullGuid;
  393. // Zone.IsEnabled = true;
  394. // iCombo--;
  395. // if (iCombo == 0)
  396. // ReloadPackets();
  397. // });
  398. // });
  399. //new Client<JobITP>().Query(
  400. // new Filter<JobITP>(x => x.Job.ID).IsEqualTo((Guid)Job.SelectedValue),
  401. // LookupFactory.DefineColumns<JobITP>(),
  402. // LookupFactory.DefineSort<JobITP>(),
  403. // (table, error) =>
  404. // {
  405. // foreach (var row in table.Rows)
  406. // ITPs[row.Get<JobITP, Guid>(x => x.ID)] = String.Format("{0}: {1}", row.Get<JobITP, String>(x => x.Code), row.Get<JobITP, String>(x => x.Description));
  407. // Dispatcher.Invoke(() =>
  408. // {
  409. // ITP.ItemsSource = ITPs;
  410. // ITP.SelectedValue = CoreUtils.FullGuid;
  411. // ITP.IsEnabled = true;
  412. // iCombo--;
  413. // if (iCombo == 0)
  414. // ReloadPackets();
  415. // });
  416. // });
  417. }
  418. private void Unit_SelectionChanged(object sender, SelectionChangedEventArgs e)
  419. {
  420. if (JobChanging || iCombo > 0)
  421. return;
  422. ReloadPackets();
  423. }
  424. private void CreateColumn(string title, Guid category)
  425. {
  426. var column = new ManufacturingPanelColumn();
  427. column.Margin = new Thickness(_columns.Any() ? 2 : 0, 0, 0, 0);
  428. column.Title = title;
  429. column.CompactView = CompactView;
  430. column.Category = category;
  431. column.SetValue(Grid.ColumnProperty, _columns.Count);
  432. column.Templates = Templates;
  433. column.Factories = Factories;
  434. column.OnChanged += Column_OnChanged;
  435. column.OnCollapsed += Column_OnCollapsed;
  436. Columns.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  437. Columns.Children.Add(column);
  438. _columns.Add(column);
  439. }
  440. private void Column_OnCollapsed(object sender, bool collapsed)
  441. {
  442. var index = _columns.IndexOf((ManufacturingPanelColumn)sender);
  443. Columns.ColumnDefinitions[index].Width = new GridLength(1, collapsed ? GridUnitType.Auto : GridUnitType.Star);
  444. }
  445. private void Column_OnChanged(object sender, EventArgs e)
  446. {
  447. Refresh();
  448. }
  449. private void ReloadFactories()
  450. {
  451. columnsizer.IsEnabled = false;
  452. Columns.Children.Clear();
  453. _columns.Clear();
  454. Columns.ColumnDefinitions.Clear();
  455. CreateColumn("To Be Issued", Guid.Empty);
  456. //Kanban.Columns.Clear();
  457. //Kanban.Columns.Add(new KanbanColumn() { Title = "To be Issued", Categories = Guid.Empty.ToString() });
  458. foreach (var Factory in Factories)
  459. if (CurrentFactory.Equals(Guid.Empty) || CurrentFactory.Equals(Factory.ID))
  460. foreach (var Section in Sections)
  461. if (Section.Factory.ID.Equals(Factory.ID) && !Section.Hidden)
  462. CreateColumn(Section.Factory.Name + ":" + Section.Name, Section.ID);
  463. //Kanban.Columns.Add(new KanbanColumn() { Title = Section.Factory.Name + ":" + Section.Name, Categories = Section.ID.ToString() });
  464. if (bIncludeCompleted)
  465. CreateColumn("Completed", CoreUtils.FullGuid);
  466. //Kanban.Columns.Add(new KanbanColumn() { Title = "Completed", Categories = CoreUtils.FullGuid.ToString() });
  467. //foreach (KanbanColumn column in Kanban.Columns)
  468. //{
  469. // ContextMenu menu = new ContextMenu();
  470. // menu.Tag = column;
  471. // MenuItem item = new MenuItem() { Header = "Select All " + column.Title + " Tasks", Tag = column };
  472. // item.Click += SelectAll_Click;
  473. // menu.Items.Add(item);
  474. // item = new MenuItem() { Header = "Unselect All " + column.Title + " Tasks", Tag = column };
  475. // item.Click += UnSelectAll_Click;
  476. // menu.Items.Add(item);
  477. // column.ContextMenu = menu;
  478. // column.AllowDrag = false;
  479. // column.AllowDrop = false;
  480. //}
  481. //ResizeColumns();
  482. //columnsizer.IsEnabled = true;
  483. }
  484. //private void SetSelectedItems(KanbanColumn column, bool selected)
  485. //{
  486. // foreach (ManufacturingKanban model in Kanbans)
  487. // {
  488. // if ((string)model.Category == column.Categories)
  489. // {
  490. // if (!CheckedKanbans.Contains(model.ID))
  491. // CheckedKanbans.Add(model.ID);
  492. // model.Checked = selected;
  493. // }
  494. // }
  495. // Kanban.ItemsSource = null;
  496. // Kanban.ItemsSource = Kanbans;
  497. //}
  498. //private void UnSelectAll_Click(object sender, RoutedEventArgs e)
  499. //{
  500. // KanbanColumn column = ((MenuItem)sender).Tag as KanbanColumn;
  501. // SetSelectedItems(column, false);
  502. //}
  503. //private void SelectAll_Click(object sender, RoutedEventArgs e)
  504. //{
  505. // KanbanColumn column = ((MenuItem)sender).Tag as KanbanColumn;
  506. // SetSelectedItems(column, true);
  507. //}
  508. private void CheckBox_Checked(object sender, RoutedEventArgs e)
  509. {
  510. //ManufacturingKanban task = ((CheckBox)sender).Tag as ManufacturingKanban;
  511. //if (CheckedKanbans.Contains(task.ID))
  512. // CheckedKanbans.Remove(task.ID);
  513. //else
  514. // CheckedKanbans.Add(task.ID);
  515. }
  516. private string GetColor(DateTime duedate, DateTime estdate)
  517. {
  518. var color = "LightGreen";
  519. if (duedate < estdate)
  520. color = "Salmon";
  521. else if (duedate < estdate.AddDays(7))
  522. color = "LightYellow";
  523. return color;
  524. }
  525. private string GetQualityStatus(QualityStatus status)
  526. {
  527. if (status == QualityStatus.Passed)
  528. return "PASSED";
  529. if (status == QualityStatus.Skipped)
  530. return "SKIPPED";
  531. if (status == QualityStatus.PassedWithIssues)
  532. return "ISSUES";
  533. if (status == QualityStatus.Failed)
  534. return "FAILED";
  535. return " ";
  536. }
  537. private void ReloadPackets()
  538. {
  539. Kanbans = new ObservableCollection<ManufacturingKanban>();
  540. var now = DateTime.Now;
  541. var elapsed = new TimeSpan(0);
  542. var CheckedKanbans = new List<string>();
  543. foreach (var column in _columns)
  544. CheckedKanbans.AddRange(column.GetSelectedKanbans("").Select(x => x.ID));
  545. var client = new Client<ManufacturingPacket>();
  546. var filter = GenerateFilter();
  547. //new CoreTable().LoadColumns(typeof(ManufacturingPacket));
  548. var columns = GenerateColumns();
  549. //var iprops = InABox.Core.DatabaseSchema.Properties(typeof(ManufacturingPacket)).Where(x => !x.Name.Equals("CustomAttributes") && !x.Name.Equals("Stages") && !x.Name.Equals("Time") && !x.Name.Equals("ActualTime") /* && !x.Name.Equals("TimeRemaining") */);
  550. //foreach (var iprop in iprops)
  551. // columns.Add(iprop.Name);
  552. now = DateTime.Now;
  553. packets = client.Query(
  554. filter,
  555. columns,
  556. SortBy.SelectedIndex == 0
  557. ? new SortOrder<ManufacturingPacket>(x => x.SetoutLink.Number)
  558. : new SortOrder<ManufacturingPacket>(x => x.DueDate).ThenBy(x => x.Priority, SortDirection.Descending)
  559. .ThenBy(x => x.SetoutLink.Number));
  560. elapsed = DateTime.Now - now;
  561. Logger.Send(LogType.Information, ClientFactory.UserID,
  562. string.Format("Retrieved {0} packets in {1}ms", packets.Rows.Count, elapsed.TotalMilliseconds));
  563. now = DateTime.Now;
  564. foreach (var row in packets.Rows)
  565. {
  566. var bOK = true;
  567. var completed = row.Get<ManufacturingPacket, DateTime>(x => x.Completed);
  568. var onhold = row.Get<ManufacturingPacket, bool>(x => x.OnHold);
  569. var issues = row.Get<ManufacturingPacket, string>(x => x.Issues);
  570. var orderitemid = row.EntityLinkID<ManufacturingPacket, PurchaseOrderItemLink>(x => x.OrderItem) ?? Guid.Empty;
  571. var orderitem = orderitemid != Guid.Empty ? OrderItems.FirstOrDefault(x => x.Item1.Equals(orderitemid)) : null;
  572. //if (bOK && !bIncludeOrders)
  573. // bOK = (orderitem == null) || !orderitem.Item2.IsEmpty();
  574. //bool bSkipJobCheck = false;
  575. var itp = row.Get<ManufacturingPacket, Guid>(x => x.ITP.ID);
  576. //if (bOK && (ITP.SelectedValue != null) && !ITP.SelectedValue.Equals(CoreUtils.FullGuid))
  577. //{
  578. // bOK = itp == (Guid)ITP.SelectedValue;
  579. // bSkipJobCheck = true;
  580. //}
  581. var jobid = row.Get<ManufacturingPacket, Guid>(x => x.SetoutLink.JobLink.ID);
  582. //if (bOK && !bSkipJobCheck && (Job.SelectedValue != null) && !Job.SelectedValue.Equals(CoreUtils.FullGuid))
  583. // bOK = jobid ==(Guid)Job.SelectedValue;
  584. var sectionid = row.Get<ManufacturingPacket, Guid>(x => x.StageLink.SectionID);
  585. //if (bOK && !CurrentFactory.Equals(Guid.Empty))
  586. // bOK = Sections.Any(x => x.Factory.ID.Equals(CurrentFactory) && x.ID.Equals(sectionid));
  587. //if (CurrentFactory != Guid.Empty)
  588. //{
  589. // var templatefilter = new Filter<ManufacturingPacket>(x => x.ManufacturingTemplateLink.Factory.ID).IsEqualTo(CurrentFactory).Or(x => x.StageLink.ID).IsNotEqualTo(Guid.Empty);
  590. // filter.Ands.Add(templatefilter);
  591. //}
  592. var title = row.Get<ManufacturingPacket, string>(x => x.Title);
  593. var serial = row.Get<ManufacturingPacket, string>(x => x.Serial);
  594. var watermark = row.Get<ManufacturingPacket, string>(x => x.WaterMark);
  595. var location = row.Get<ManufacturingPacket, string>(x => x.Location);
  596. var setoutlocation = row.Get<ManufacturingPacket, string>(x => x.SetoutLink.Location);
  597. var setoutnumber = row.Get<ManufacturingPacket, string>(x => x.SetoutLink.Number);
  598. var setoutdescription = row.Get<ManufacturingPacket, string>(x => x.SetoutLink.Description);
  599. var templateid = row.Get<ManufacturingPacket, Guid>(x => x.ManufacturingTemplateLink.ID);
  600. var templatecode = Templates.FirstOrDefault(x => x.ID.Equals(templateid))?.Code;
  601. //if (bOK && !String.IsNullOrWhiteSpace(SearchBox.Text))
  602. //{
  603. // var search = SearchBox.Text.ToUpper();
  604. // bOK = title.ToUpper().Contains(search)
  605. // || serial.ToUpper().Contains(search)
  606. // || watermark.ToUpper().Contains(search)
  607. // || location.ToUpper().Contains(search)
  608. // || setoutlocation.ToUpper().Contains(search)
  609. // || setoutnumber.ToUpper().Contains(search)
  610. // || templatecode.ToUpper().Contains(search);
  611. //}
  612. if (bOK)
  613. {
  614. var id = row.Get<ManufacturingPacket, Guid>(x => x.ID);
  615. var priority = row.Get<ManufacturingPacket, bool>(x => x.Priority);
  616. var distributed = row.Get<ManufacturingPacket, bool>(x => x.Distributed);
  617. var barcodeqty = row.Get<ManufacturingPacket, int>(x => x.BarcodeQty);
  618. var quantity = row.Get<ManufacturingPacket, int>(x => x.Quantity);
  619. var estimateddate = row.Get<ManufacturingPacket, DateTime>(x => x.EstimatedDate);
  620. var created = row.Get<ManufacturingPacket, DateTime>(x => x.Created);
  621. var duedate = row.Get<ManufacturingPacket, DateTime>(x => x.DueDate);
  622. var barcodeprinted = row.Get<ManufacturingPacket, DateTime>(x => x.BarcodePrinted);
  623. var barcodetype = row.Get<ManufacturingPacket, BarcodeType>(x => x.BarcodeType);
  624. var stageid = row.Get<ManufacturingPacket, Guid>(x => x.StageLink.ID);
  625. var stageValid = Entity.IsEntityLinkValid<ManufacturingPacket, ManufacturingPacketStageLink>(x => x.StageLink, row);
  626. var station = row.Get<ManufacturingPacket, int>(x => x.StageLink.Station);
  627. var time = row.Get<ManufacturingPacket, TimeSpan>(x => x.StageLink.Time);
  628. var percentagecomplete = row.Get<ManufacturingPacket, double>(x => x.StageLink.PercentageComplete);
  629. var jobrow = Jobs.Rows.FirstOrDefault(r => r.Get<Job, Guid>(c => c.ID).Equals(jobid));
  630. var jobname = jobrow?.Get<Job, string>(c => c.Name);
  631. var jobnumber = jobrow?.Get<Job, string>(c => c.JobNumber);
  632. var model = new ManufacturingKanban();
  633. var flags = new List<string>();
  634. if (onhold)
  635. flags.Add("HOLD");
  636. if (priority)
  637. flags.Add("PRIORITY");
  638. if (distributed)
  639. flags.Add("DISTRIB");
  640. model.ID = id.ToString();
  641. var sTitle = string.Format("{0}{1}", quantity != barcodeqty ? string.Format("{0} x ", quantity) : "",
  642. row.Get<ManufacturingPacket, string>(x => x.Title));
  643. model.Title = CompactView
  644. ? string.Format("{0} x {1} / {2} {3}",
  645. barcodeqty,
  646. setoutnumber,
  647. serial,
  648. sTitle
  649. )
  650. : string.Format("{0}: {1}",
  651. serial,
  652. sTitle
  653. );
  654. if (!string.IsNullOrWhiteSpace(watermark))
  655. model.Title = "[" + watermark + "] " + model.Title;
  656. model.Quantity = barcodeqty;
  657. model.JobName = string.Format("{0}: {1}", setoutnumber, jobname);
  658. model.CreatedDate = created;
  659. model.DueDate = duedate;
  660. model.Time = time;
  661. model.PercentageComplete = percentagecomplete;
  662. if (string.IsNullOrEmpty(location))
  663. location = setoutlocation;
  664. var descrip = new List<string>();
  665. //List<String> locdesc = new List<string>()
  666. //{
  667. // row.Get<ManufacturingPacket,String>(x=>x.Level.Code),
  668. // row.Get<ManufacturingPacket,String>(x=>x.Zone.Code),
  669. // location
  670. //};
  671. //descrip.Add(String.Join(" / ", locdesc.Where(x => !String.IsNullOrWhiteSpace(x))));
  672. descrip.Add(location);
  673. if (orderitem != null)
  674. descrip.Add(orderitem.Item3);
  675. model.Description = string.Join("\n", descrip);
  676. model.TemplateID = row.Get<ManufacturingPacket, Guid>(c => c.ManufacturingTemplateLink.ID);
  677. model.Image = !barcodeprinted.IsEmpty() ? barcode : barcodetype == BarcodeType.None ? disabled : null;
  678. model.Tags = new string[] { };
  679. model.Category = completed != DateTime.MinValue ? CoreUtils.FullGuid : sectionid;
  680. if (priority)
  681. model.ColorKey = "Red";
  682. else if (onhold)
  683. model.ColorKey = "Silver";
  684. else
  685. model.ColorKey = GetColor(
  686. duedate.IsEmpty() ? DateTime.Today : duedate,
  687. estimateddate.IsEmpty() ? DateTime.Today : estimateddate
  688. );
  689. model.IssuesImage = string.IsNullOrWhiteSpace(issues)
  690. ? null
  691. : speechbubble;
  692. model.Issues = issues;
  693. if (orderitem != null)
  694. {
  695. var bOnOrder = orderitem.Item2.IsEmpty();
  696. model.OrderColor = bOnOrder ? "Plum" : "DarkOrchid";
  697. model.OrderStatus = bOnOrder ? "ON ORDER" : "RECEIVED";
  698. }
  699. else
  700. {
  701. model.OrderColor = model.ColorKey;
  702. model.OrderStatus = "";
  703. }
  704. model.Checked = CheckedKanbans.Contains(id.ToString());
  705. model.Flags = string.Join("\n", flags);
  706. model.Template = templatecode;
  707. if (!stageValid || stageid.Equals(Guid.Empty) || stageid.Equals(CoreUtils.FullGuid))
  708. {
  709. model.Status = "";
  710. }
  711. else
  712. {
  713. if (station == 0)
  714. model.Status = "Not Started";
  715. else
  716. model.Status = string.Format("{0} ({1:F0}%)", station == -1 ? "Shared" : "Stn " + station, percentagecomplete);
  717. }
  718. Kanbans.Add(model);
  719. }
  720. }
  721. elapsed = DateTime.Now - now;
  722. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Processed Kanbans in {0}ms", elapsed.TotalMilliseconds));
  723. now = DateTime.Now;
  724. foreach (var column in _columns)
  725. {
  726. column.packets = packets;
  727. column.Kanbans = Kanbans.Where(x => x.Category.Equals(column.Category)).ToArray();
  728. }
  729. //foreach (var col in Kanban.Columns)
  730. // col.IsExpanded = Kanbans.Where(x => col.Categories.Contains(x.Category.ToString())).Count() > 0;
  731. //bResizeRequired = true;
  732. //Kanban.ItemsSource = null;
  733. //Kanban.ItemsSource = Kanbans;
  734. elapsed = DateTime.Now - now;
  735. Logger.Send(LogType.Information, ClientFactory.UserID, string.Format("Loaded Columns in {0}ms", elapsed.TotalMilliseconds));
  736. }
  737. private Filter<ManufacturingPacket> GenerateFilter()
  738. {
  739. var filter = new Filter<ManufacturingPacket>(x => x.Archived).IsEqualTo(DateTime.MinValue);
  740. if (!bIncludeCompleted)
  741. filter = filter.And(x => x.Completed).IsEqualTo(DateTime.MinValue);
  742. if (!bIncludeHeld)
  743. // filter = filter.And(x => x.OnHold).IsEqualTo(false);
  744. filter = filter.And(x => x.OnHold).IsEqualTo(false);
  745. if (!bIncludeOrders)
  746. {
  747. var orderfilter = new Filter<ManufacturingPacket>(x => x.OrderItem).NotLinkValid().Or(x => x.OrderItem.ReceivedDate)
  748. .IsNotEqualTo(DateTime.MinValue);
  749. filter = filter.And(orderfilter);
  750. }
  751. var bSkipJobCheck = false;
  752. if (ITP.SelectedValue != null && !ITP.SelectedValue.Equals(CoreUtils.FullGuid))
  753. {
  754. filter = filter.And(x => x.ITP.ID).IsEqualTo((Guid)ITP.SelectedValue);
  755. bSkipJobCheck = true;
  756. }
  757. if (!bSkipJobCheck && Job.SelectedValue != null && !Job.SelectedValue.Equals(CoreUtils.FullGuid))
  758. filter = filter.And(x => x.SetoutLink.JobLink.ID).IsEqualTo((Guid)Job.SelectedValue);
  759. var sctflt = new Filter<ManufacturingPacket>(x => x.StageLink).NotLinkValid();
  760. foreach (var Section in Sections.Where(x => CurrentFactory.Equals(Guid.Empty) || x.Factory.ID.Equals(CurrentFactory)))
  761. sctflt = sctflt.Or(x => x.StageLink.SectionID).IsEqualTo(Section.ID);
  762. filter.Ands.Add(sctflt);
  763. if (CurrentFactory != Guid.Empty)
  764. {
  765. var templatefilter = new Filter<ManufacturingPacket>(x => x.ManufacturingTemplateLink.Factory.ID).IsEqualTo(CurrentFactory)
  766. .Or(x => x.StageLink).LinkValid();
  767. filter.Ands.Add(templatefilter);
  768. }
  769. if (!string.IsNullOrWhiteSpace(SearchBox.Text))
  770. filter = filter.TextSearch(
  771. SearchBox.Text,
  772. x => x.SetoutLink.JobLink.JobNumber,
  773. x => x.SetoutLink.JobLink.Name,
  774. x => x.SetoutLink.Number,
  775. x => x.SetoutLink.Description,
  776. //x => x.SetoutLink.Reference,
  777. x => x.SetoutLink.Location,
  778. //x => x.Unit.Code,
  779. //x => x.Unit.Description,
  780. x => x.ITP.Code,
  781. x => x.ITP.Description,
  782. x => x.Title,
  783. x => x.Serial,
  784. x => x.Location,
  785. x => x.WaterMark,
  786. x => x.ManufacturingTemplateLink.Code
  787. );
  788. return filter;
  789. }
  790. private static Columns<ManufacturingPacket> GenerateColumns()
  791. {
  792. var columns = new Columns<ManufacturingPacket>();
  793. columns.Add(x => x.ID);
  794. //columns.Add(x => x.OnHold);
  795. columns.Add(x => x.OnHold);
  796. columns.Add(x => x.Issues);
  797. columns.Add(x => x.Priority);
  798. columns.Add(x => x.Distributed);
  799. columns.Add(x => x.BarcodeQty);
  800. columns.Add(x => x.Quantity);
  801. columns.Add(x => x.Title);
  802. columns.Add(x => x.Serial);
  803. columns.Add(x => x.WaterMark);
  804. columns.Add(x => x.EstimatedDate);
  805. columns.Add(x => x.Created);
  806. columns.Add(x => x.DueDate);
  807. columns.Add(x => x.Location);
  808. columns.Add(x => x.BarcodePrinted);
  809. columns.Add(x => x.BarcodeType);
  810. columns.Add(x => x.Completed);
  811. //columns.Add(x => x.TimeRemaining);
  812. columns.Add(x => x.Group);
  813. columns.Add(x => x.SetoutLink.ID);
  814. columns.Add(x => x.SetoutLink.Number);
  815. columns.Add(x => x.SetoutLink.Description);
  816. columns.Add(x => x.SetoutLink.Location);
  817. columns.Add(x => x.SetoutLink.JobLink.ID);
  818. columns.Add(x => x.OrderItem.ID);
  819. //columns.Add(x => x.OrderItem.ReceivedDate);
  820. //columns.Add(x => x.OrderItem.Consignment.EstimatedWarehouseArrival);
  821. //columns.Add(x => x.OrderItem.PurchaseOrderLink.SupplierLink.Code);
  822. //columns.Add(x => x.OrderItem.PurchaseOrderLink.PONumber);
  823. columns.Add(x => x.ManufacturingTemplateLink.ID);
  824. columns.Add(x => x.ITP.ID);
  825. columns.Add(x => x.StageLink.ID);
  826. columns.Add(x => x.StageLink.SectionID);
  827. columns.Add(x => x.StageLink.Station);
  828. columns.Add(x => x.StageLink.Time);
  829. columns.Add(x => x.StageLink.PercentageComplete);
  830. columns.Add(x => x.StageLink.Deleted);
  831. return columns;
  832. }
  833. private void Factories_SelectionChanged(object sender, SelectionChangedEventArgs e)
  834. {
  835. if (e.AddedItems.Count == 0)
  836. return;
  837. var selected = (Tuple<string, BitmapImage, Guid>)e.AddedItems[0];
  838. CurrentFactory = selected.Item3;
  839. if (IsReady)
  840. SaveSettings();
  841. foreach (var column in _columns)
  842. column.ClearSelectedKanbans();
  843. //column.CheckedKanbans.Clear();
  844. //CheckedKanbans.Clear();
  845. if (IsReady)
  846. Refresh();
  847. }
  848. private void SortBy_SelectionChanged(object sender, SelectionChangedEventArgs e)
  849. {
  850. if (e.AddedItems.Count == 0)
  851. return;
  852. var selected = (ComboBoxItem)e.AddedItems[0];
  853. SortByDueDate = selected.Content.Equals("Due Date");
  854. if (IsReady)
  855. SaveSettings();
  856. foreach (var column in _columns)
  857. column.ClearSelectedKanbans();
  858. //column.CheckedKanbans.Clear();
  859. //CheckedKanbans.Clear();
  860. if (IsReady)
  861. Refresh();
  862. }
  863. private void View_SelectionChanged(object sender, SelectionChangedEventArgs e)
  864. {
  865. if (e.AddedItems.Count == 0)
  866. return;
  867. var selected = (ComboBoxItem)e.AddedItems[0];
  868. CompactView = selected.Content.Equals("Compact");
  869. ConsolidatedView = selected.Content.Equals("Consolidated");
  870. if (IsReady)
  871. SaveSettings();
  872. foreach (var column in _columns)
  873. column.ClearSelectedKanbans();
  874. //column.CheckedKanbans.Clear();
  875. //CheckedKanbans.Clear();
  876. if (IsReady)
  877. Refresh();
  878. }
  879. private ManufacturingPacket[] GetSelectedPackets(string currentid)
  880. {
  881. var rows = packets.Rows.Where(r => r.Get<ManufacturingPacket, Guid>(c => c.ID).Equals(Guid.Parse(currentid)));
  882. return rows.Select(r => r.ToObject<ManufacturingPacket>()).ToArray();
  883. }
  884. private void SearchBox_KeyUp(object sender, KeyEventArgs e)
  885. {
  886. if (string.IsNullOrWhiteSpace(SearchBox.Text) || e.Key == Key.Return)
  887. Refresh();
  888. }
  889. private void IncludeCompleted_Click(object sender, RoutedEventArgs e)
  890. {
  891. bIncludeCompleted = IncludeCompleted.IsChecked == true;
  892. if (IsReady)
  893. {
  894. SaveSettings();
  895. Refresh();
  896. }
  897. }
  898. private void IncludeHeld_Click(object sender, RoutedEventArgs e)
  899. {
  900. bIncludeHeld = IncludeHeld.IsChecked == true;
  901. if (IsReady)
  902. {
  903. SaveSettings();
  904. Refresh();
  905. }
  906. }
  907. private void IncludeOrders_Click(object sender, RoutedEventArgs e)
  908. {
  909. bIncludeOrders = IncludeOrders.IsChecked == true;
  910. if (IsReady)
  911. {
  912. SaveSettings();
  913. Refresh();
  914. }
  915. }
  916. private void SaveSettings()
  917. {
  918. var user = new ManufacturingSettings
  919. {
  920. FactoryID = CurrentFactory,
  921. SortByDueDate = SortByDueDate,
  922. CompactView = CompactView,
  923. ConsolidatedView = ConsolidatedView,
  924. IncludeHeld = bIncludeHeld,
  925. IncludeOrders = bIncludeOrders,
  926. IncludeCompleted = bIncludeCompleted
  927. };
  928. new UserConfiguration<ManufacturingSettings>().Save(user);
  929. }
  930. private void Export_Click(object sender, RoutedEventArgs e)
  931. {
  932. IEnumerable<string> columns = string.IsNullOrWhiteSpace(settings.ExportColumns) ? new string[] { } : settings.ExportColumns.Split(',');
  933. if (!columns.Any())
  934. columns = packets.Columns.Select(x => x.ColumnName);
  935. var form = new DynamicExportForm(typeof(ManufacturingPacket), columns);
  936. if (form.ShowDialog() != true)
  937. return;
  938. settings.ExportColumns = string.Join(",", form.Fields);
  939. new UserConfiguration<ManufacturingSettings>().Save(settings);
  940. var export = new Client<ManufacturingPacket>().Query(
  941. GenerateFilter(),
  942. new Columns<ManufacturingPacket>(form.Fields),
  943. LookupFactory.DefineSort<ManufacturingPacket>()
  944. );
  945. ExcelExporter.DoExport<ManufacturingPacket>(export, string.Format("Manufacturing {0:dd-MMM-yy}", DateTime.Today));
  946. }
  947. }
  948. }