ManufacturingPanelColumn.xaml.cs 59 KB

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