ManufacturingPanelColumn.xaml.cs 57 KB

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