JobRequisitionReviewGrid.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. using Comal.Classes;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using InABox.DynamicGrid;
  5. using InABox.WPF;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. using System.Windows.Controls;
  13. using System.Windows.Media;
  14. namespace PRSDesktop
  15. {
  16. public delegate void JobRequiItemSelect(JobRequisitionItem item);
  17. public delegate void GridRefresh();
  18. public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
  19. {
  20. public event JobRequiItemSelect OnJobRequiItemSelected;
  21. public event GridRefresh OnGridRefresh;
  22. List<Guid> filterProductIDs = new List<Guid>();
  23. public Guid empID = new Guid();
  24. string empName = "";
  25. bool bIncludeArchived = false;
  26. bool bViewCancelled = false;
  27. public JobRequisitionReviewGrid()
  28. {
  29. Options.AddRange(
  30. DynamicGridOption.FilterRows,
  31. DynamicGridOption.SelectColumns,
  32. DynamicGridOption.RecordCount,
  33. DynamicGridOption.MultiSelect
  34. );
  35. HiddenColumns.Add(x => x.ID);
  36. HiddenColumns.Add(x => x.Product.ID);
  37. HiddenColumns.Add(x => x.Product.Code);
  38. HiddenColumns.Add(x => x.Product.Group.ID);
  39. HiddenColumns.Add(x => x.Product.Group.Code);
  40. HiddenColumns.Add(x => x.Product.Group.Description);
  41. HiddenColumns.Add(x => x.Style.ID);
  42. HiddenColumns.Add(x => x.Style.Code);
  43. HiddenColumns.Add(x => x.Style.Description);
  44. HiddenColumns.Add(x => x.Requisition.ID);
  45. HiddenColumns.Add(x => x.Requisition.Job.ID);
  46. HiddenColumns.Add(x => x.Requisition.Job.JobNumber);
  47. HiddenColumns.Add(x => x.Requisition.Job.Name);
  48. HiddenColumns.Add(x => x.Requisition.Number);
  49. HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.ID);
  50. HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber);
  51. HiddenColumns.Add(x => x.PurchaseOrderItem.DueDate);
  52. HiddenColumns.Add(x => x.Job.ID);
  53. HiddenColumns.Add(x => x.Dimensions.UnitSize);
  54. HiddenColumns.Add(x => x.Dimensions.Length);
  55. HiddenColumns.Add(x => x.Dimensions.Width);
  56. HiddenColumns.Add(x => x.Dimensions.Height);
  57. HiddenColumns.Add(x => x.Dimensions.Weight);
  58. HiddenColumns.Add(x => x.Dimensions.Quantity);
  59. HiddenColumns.Add(x => x.Dimensions.Value);
  60. HiddenColumns.Add(x => x.Dimensions.Unit.ID);
  61. HiddenColumns.Add(x => x.Dimensions.Unit.HasLength);
  62. HiddenColumns.Add(x => x.Dimensions.Unit.HasHeight);
  63. HiddenColumns.Add(x => x.Dimensions.Unit.HasWidth);
  64. HiddenColumns.Add(x => x.Dimensions.Unit.HasWeight);
  65. HiddenColumns.Add(x => x.Dimensions.Unit.HasQuantity);
  66. HiddenColumns.Add(x => x.Dimensions.Unit.Formula);
  67. HiddenColumns.Add(x => x.Dimensions.Unit.Format);
  68. HiddenColumns.Add(x => x.Dimensions.Unit.Code);
  69. HiddenColumns.Add(x => x.Dimensions.Unit.Description);
  70. if (Security.CanEdit<JobRequisitionItem>())
  71. ActionColumns.Add(new DynamicMenuColumn(BuildMenu, EmptyReturnFunction));
  72. if (Security.CanEdit<PurchaseOrder>())
  73. AddButton("Create Purchase Order", null, CreatePurchaseOrder);
  74. if (Security.CanEdit<PurchaseOrder>())
  75. AddButton("Create Treatment PO", null, CreateTreatmentPO);
  76. AddButton("Include Archived", null, ViewArchived);
  77. AddButton("Include Cancelled", null, ViewCancelled);
  78. OnSelectItem += JobRequisitionReviewGrid_OnSelectItem;
  79. ColumnsTag = "JobRequisitionReview";
  80. CoreTable table = new Client<Employee>().Query(new Filter<Employee>(x => x.UserLink.UserID).IsEqualTo(ClientFactory.UserID), new Columns<Employee>(x => x.ID, x => x.Name));
  81. if (table.Rows.Any())
  82. {
  83. empID = Guid.Parse(table.Rows.FirstOrDefault().Values[0].ToString());
  84. empName = table.Rows.FirstOrDefault().Values[1].ToString();
  85. }
  86. }
  87. private void JobRequisitionReviewGrid_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
  88. {
  89. OnJobRequiItemSelected?.Invoke(SelectedRows[0].ToObject<JobRequisitionItem>());
  90. }
  91. private bool ViewCancelled(Button button, CoreRow[] rows)
  92. {
  93. if (bViewCancelled)
  94. {
  95. bViewCancelled = false;
  96. button.Content = "Include Cancelled";
  97. }
  98. else
  99. {
  100. bViewCancelled = true;
  101. button.Content = "Exclude Cancelled";
  102. }
  103. OnGridRefresh?.Invoke();
  104. return true;
  105. }
  106. private bool ViewArchived(Button button, CoreRow[] rows)
  107. {
  108. if (bIncludeArchived)
  109. {
  110. bIncludeArchived = false;
  111. button.Content = "Include Archived";
  112. }
  113. else
  114. {
  115. bIncludeArchived = true;
  116. button.Content = "Exclude Archived";
  117. }
  118. OnGridRefresh?.Invoke();
  119. return true;
  120. }
  121. private bool CreateTreatmentPO(Button button, CoreRow[] rows)
  122. {
  123. return true;
  124. }
  125. protected override void GenerateColumns(DynamicGridColumns columns)
  126. {
  127. columns.Add<JobRequisitionItem, DateTime>(x => x.Created, 80, "Date", "", Alignment.MiddleLeft);
  128. columns.Add<JobRequisitionItem, string>(x => x.Requisition.Job.JobNumber, 70, "Job", "", Alignment.MiddleLeft);
  129. columns.Add<JobRequisitionItem, int>(x => x.Requisition.Number, 50, "NO.", "", Alignment.MiddleLeft);
  130. columns.Add<JobRequisitionItem, string>(x => x.Product.Code, 70, "Code", "", Alignment.MiddleLeft);
  131. columns.Add<JobRequisitionItem, string>(x => x.Product.Name, 200, "Product Name", "", Alignment.MiddleLeft);
  132. columns.Add<JobRequisitionItem, string>(x => x.Style.Description, 150, "Style", "", Alignment.MiddleLeft);
  133. columns.Add<JobRequisitionItem, double>(x => x.Qty, 50, "Qty", "", Alignment.MiddleLeft);
  134. columns.Add<JobRequisitionItem, string>(x => x.Dimensions.UnitSize, 50, "Size", "", Alignment.MiddleLeft);
  135. columns.Add<JobRequisitionItem, string>(x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber, 80, "PO Number", "", Alignment.MiddleLeft);
  136. columns.Add<JobRequisitionItem, string>(x => x.PurchaseOrderItem.PONumber, 80, "PO Number", "", Alignment.MiddleLeft);
  137. columns.Add<JobRequisitionItem, DateTime>(x => x.PurchaseOrderItem.DueDate, 80, "Due", "", Alignment.MiddleLeft);
  138. columns.Add<JobRequisitionItem, DateTime>(x => x.PurchaseOrderItem.ReceivedDate, 80, "Received", "", Alignment.MiddleLeft);
  139. columns.Add<JobRequisitionItem, JobRequisitionItemStatus>(x => x.Status, 80, "Status", "", Alignment.MiddleLeft);
  140. columns.Add<JobRequisitionItem, string>(x => x.Notes, 300, "Notes", "", Alignment.MiddleLeft);
  141. }
  142. private DynamicMenuStatus EmptyReturnFunction(CoreRow row)
  143. {
  144. return DynamicMenuStatus.Enabled;
  145. }
  146. #region Action Column Buttons
  147. private bool CheckValidAction(JobRequisitionItem item, bool bypassReserved)
  148. {
  149. bool valid = true;
  150. if (item.Status == JobRequisitionItemStatus.Reserved && !bypassReserved)
  151. {
  152. MessageBox.Show("Error. Item has already been reserved!");
  153. return false;
  154. }
  155. else if (item.Status == JobRequisitionItemStatus.OnOrder)
  156. {
  157. MessageBox.Show("Error. Item is already on order!");
  158. return false;
  159. }
  160. if (item.Status == JobRequisitionItemStatus.Received)
  161. {
  162. MessageBox.Show("Error. Item has already been recieved!");
  163. return false;
  164. }
  165. return valid;
  166. }
  167. private void SplitLine(JobRequisitionItem item, double oldItemQty, double newItemQty, string notes)
  168. {
  169. List<JobRequisitionItem> items = new List<JobRequisitionItem>();
  170. JobRequisitionItem newItem = new JobRequisitionItem();
  171. newItem.Requisition.ID = item.Requisition.ID;
  172. newItem.Requisition.Job.ID = item.Requisition.Job.ID;
  173. newItem.Requisition.Job.JobNumber = item.Requisition.Job.JobNumber;
  174. newItem.Requisition.Job.Name = item.Requisition.Job.Name;
  175. newItem.Product.ID = item.Product.ID;
  176. newItem.Product.Name = item.Product.Name;
  177. newItem.Product.Code = item.Product.Code;
  178. newItem.Product.Group.ID = item.Product.Group.ID;
  179. newItem.Product.Group.Description = item.Product.Group.Description;
  180. newItem.Dimensions.CopyFrom(item.Dimensions);
  181. newItem.Style.ID = item.Style.ID;
  182. newItem.Style.Description = item.Style.Description;
  183. newItem.Style.Code = item.Style.Code;
  184. newItem.Notes = item.Notes + Environment.NewLine + notes;
  185. item.Notes = newItem.Notes;
  186. item.Qty = oldItemQty;
  187. newItem.Qty = newItemQty;
  188. items.Add(newItem);
  189. items.Add(item);
  190. new Client<JobRequisitionItem>().Save(items, "Split lines from Job Requi Item Review Dashboard");
  191. MessageBox.Show("Line split - original line Qty is now " + item.Qty + ". New line Qty is " + newItem.Qty, "Success");
  192. OnGridRefresh?.Invoke();
  193. }
  194. private void SplitLine_Clicked(CoreRow row)
  195. {
  196. JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
  197. if (CheckValidAction(item, false))
  198. {
  199. int units = Convert.ToInt32(item.Qty);
  200. if (NumberEdit.Execute("Enter amount to split", 1, units, ref units))
  201. {
  202. SplitLine(item, item.Qty - units, units, "Line split");
  203. }
  204. }
  205. }
  206. private void Archive_Clicked(CoreRow row)
  207. {
  208. JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
  209. SaveRow(row, JobRequisitionItemStatus.Archived, "Line marked as Archived by " + empName + " on " + DateTime.Now.ToString("dd MMM yy"));
  210. }
  211. private void OrderRequired_Clicked(CoreRow row)
  212. {
  213. JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
  214. if (CheckValidAction(item, false))
  215. SaveRow(row, JobRequisitionItemStatus.OrderRequired, "Line marked as Order Required by " + empName + " on " + DateTime.Now.ToString("dd MMM yy"));
  216. }
  217. private void TreatmentRequired_Clicked(CoreRow row)
  218. {
  219. JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
  220. if (item.Status != JobRequisitionItemStatus.Reserved)
  221. {
  222. MessageBox.Show("Stock must first be reserved for this item");
  223. return;
  224. }
  225. SaveRow(row, JobRequisitionItemStatus.TreatmentRequired, "Line marked as Treatment Required by " + empName + " on " + DateTime.Now.ToString("dd MMM yy"));
  226. }
  227. private void Uncheck_Clicked(CoreRow row)
  228. {
  229. string extraMessage = "";
  230. JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
  231. if (!CheckValidAction(item, true))
  232. return;
  233. CoreTable table = new Client<StockMovement>().Query
  234. (
  235. new Filter<StockMovement>(x => x.JobRequisitionItem.ID).IsEqualTo(item.ID),
  236. new Columns<StockMovement>(x => x.ID)
  237. );
  238. if (table.Rows.Any())
  239. {
  240. var result = MessageBox.Show("This will reverse stock movements already created for this Requisition Item. Proceed?", "Alert", MessageBoxButton.YesNo);
  241. switch (result)
  242. {
  243. case MessageBoxResult.Yes:
  244. break;
  245. case MessageBoxResult.No:
  246. return;
  247. default:
  248. return;
  249. }
  250. List<StockMovement> movements = new List<StockMovement>();
  251. foreach (CoreRow stockmovementRow in table.Rows)
  252. {
  253. StockMovement movement = new StockMovement();
  254. movement.ID = Guid.Parse(stockmovementRow.Values[0].ToString());
  255. movements.Add(movement);
  256. }
  257. new Client<StockMovement>().Delete(movements, "Stock movements reversed from Job Requisition Item Review Dashboard");
  258. extraMessage = " and Stock Movements Reversed ";
  259. }
  260. SaveRow(row, JobRequisitionItemStatus.NotChecked, "Line marked as Not Checked by " + empName + extraMessage + " on " + DateTime.Now.ToString("dd MMM yy"));
  261. }
  262. private bool CreatePurchaseOrder(Button btn, CoreRow[] rows)
  263. {
  264. if (!rows.Any())
  265. {
  266. MessageBox.Show("Please select at least one row to add to Purchase Order!");
  267. return false;
  268. }
  269. PurchaseOrder purchaseOrder = new PurchaseOrder();
  270. purchaseOrder.Notes = "Created from Job Requi Item Review Screen" + System.Environment.NewLine;
  271. purchaseOrder.RaisedBy.ID = empID;
  272. var page = new SupplierPurchaseOrders();
  273. page.OnAfterSave += (form, items) =>
  274. {
  275. PurchaseOrderOnSave(form, items.Cast<PurchaseOrder>().ToArray());
  276. };
  277. return page.EditItems(new[] { purchaseOrder }, LoadPurchaseOrderItems, true);
  278. }
  279. private void PurchaseOrderOnSave(IDynamicEditorForm form, PurchaseOrder[] items)
  280. {
  281. Progress.Show("Working");
  282. Guid POID = items[0].ID;
  283. CoreTable table = new Client<PurchaseOrderItem>().Query(new Filter<PurchaseOrderItem>(x => x.PurchaseOrderLink.ID).IsEqualTo(POID),
  284. new Columns<PurchaseOrderItem>(x => x.ID, x => x.Product.ID, x => x.Qty, x => x.Dimensions.UnitSize, x => x.DueDate, x => x.Job.ID));
  285. if (table.Rows.Any())
  286. {
  287. var poItems = AddPOItems(table, new List<PurchaseOrderItem>());
  288. var requiItems = MatchRequiItems(poItems, new List<JobRequisitionItem>());
  289. if (requiItems.Count > 0)
  290. SaveAndRefreshScreen(requiItems);
  291. }
  292. Progress.Close();
  293. }
  294. private void SaveAndRefreshScreen(List<JobRequisitionItem> requiItems)
  295. {
  296. new Client<JobRequisitionItem>().Save(requiItems, "Updated on Create Purchase Order from Job Requi Dashboard");
  297. OnGridRefresh?.Invoke();
  298. }
  299. private List<PurchaseOrderItem> AddPOItems(CoreTable table, List<PurchaseOrderItem> poItems)
  300. {
  301. foreach (CoreRow row in table.Rows)
  302. {
  303. PurchaseOrderItem poItem = row.ToObject<PurchaseOrderItem>();
  304. poItems.Add(poItem);
  305. }
  306. return poItems;
  307. }
  308. private List<JobRequisitionItem> MatchRequiItems(List<PurchaseOrderItem> poItems, List<JobRequisitionItem> requiItems)
  309. {
  310. foreach (CoreRow row in SelectedRows)
  311. {
  312. JobRequisitionItem JobReqItem = row.ToObject<JobRequisitionItem>();
  313. foreach (var item in poItems)
  314. {
  315. if (string.IsNullOrWhiteSpace(JobReqItem.Dimensions.UnitSize))
  316. JobReqItem.Dimensions.UnitSize = QueryUnitSize(JobReqItem.Product.ID);
  317. if (string.IsNullOrWhiteSpace(item.Dimensions.UnitSize))
  318. item.Dimensions.UnitSize = QueryUnitSize(item.Product.ID);
  319. if (JobReqItem.Job.ID == Guid.Empty)
  320. JobReqItem.Job.ID = QueryJobID(JobReqItem.Requisition.ID);
  321. if (item.Job.ID == Guid.Empty)
  322. item.Job.ID = QueryJobID(JobReqItem.Requisition.ID);
  323. if (MatchReqItemToPOItem(JobReqItem, item))
  324. requiItems.Add(UpdateJobReqItemWithPODetails(JobReqItem, item));
  325. }
  326. }
  327. return requiItems;
  328. }
  329. private JobRequisitionItem UpdateJobReqItemWithPODetails(JobRequisitionItem JobReqItem, PurchaseOrderItem item)
  330. {
  331. JobReqItem.PurchaseOrderItem.ID = item.ID;
  332. JobReqItem.PurchaseOrderItem.DueDate = item.DueDate;
  333. if (JobReqItem.Status != JobRequisitionItemStatus.OnOrder)
  334. {
  335. JobReqItem.Notes = JobReqItem.Notes + Environment.NewLine + "Line marked as On Order by " + empName + " on " + DateTime.Now.ToString("dd MMM yy");
  336. JobReqItem.Status = JobRequisitionItemStatus.OnOrder;
  337. }
  338. return JobReqItem;
  339. }
  340. private bool MatchReqItemToPOItem(JobRequisitionItem JobReqItem, PurchaseOrderItem item)
  341. {
  342. if (JobReqItem.Product.ID == item.Product.ID &&
  343. JobReqItem.Dimensions.UnitSize == item.Dimensions.UnitSize &&
  344. JobReqItem.Job.ID == item.Job.ID)
  345. return true;
  346. else
  347. return false;
  348. }
  349. private string QueryUnitSize(Guid productID)
  350. {
  351. CoreTable table = new Client<Product>().Query(new Filter<Product>(x => x.ID).IsEqualTo(productID),
  352. new Columns<Product>(x => x.Dimensions.UnitSize));
  353. return table.Rows.FirstOrDefault().Get<string>("Dimensions.UnitSize");
  354. }
  355. private Guid QueryJobID(Guid iD)
  356. {
  357. CoreTable table = new Client<JobRequisition>().Query(new Filter<JobRequisition>(x => x.ID).IsEqualTo(iD),
  358. new Columns<JobRequisition>(x => x.Job.ID));
  359. return table.Rows.FirstOrDefault().Get<Guid>("Job.ID");
  360. }
  361. private CoreTable LoadPurchaseOrderItems(Type arg)
  362. {
  363. Progress.Show("Working");
  364. var result = new CoreTable();
  365. result.LoadColumns(typeof(PurchaseOrderItem));
  366. List<PurchaseOrderItem> items = new List<PurchaseOrderItem>();
  367. foreach (CoreRow row in SelectedRows)
  368. {
  369. JobRequisitionItem JobReqItem = row.ToObject<JobRequisitionItem>();
  370. PurchaseOrderItem POItem = new PurchaseOrderItem();
  371. POItem.Product.ID = JobReqItem.Product.ID;
  372. POItem.Product.Code = JobReqItem.Product.Code;
  373. POItem.Product.Name = JobReqItem.Product.Name;
  374. POItem.Description = JobReqItem.Product.Name;
  375. POItem.Qty = JobReqItem.Qty;
  376. POItem.Dimensions.CopyFrom(JobReqItem.Dimensions);
  377. POItem.Style.ID = JobReqItem.Style.ID;
  378. POItem.Style.Code = JobReqItem.Style.Code;
  379. POItem.Style.Description = JobReqItem.Style.Description;
  380. POItem.Job.ID = JobReqItem.Requisition.Job.ID;
  381. POItem.Dimensions.UnitSize = JobReqItem.Dimensions.UnitSize;
  382. items.Add(POItem);
  383. }
  384. result.LoadRows(items);
  385. Progress.Close();
  386. return result;
  387. }
  388. #endregion
  389. #region Utils
  390. private void SaveRow(CoreRow row, JobRequisitionItemStatus status, string note)
  391. {
  392. if (row == null)
  393. return;
  394. var id = row.Get<JobRequisitionItem, Guid>(c => c.ID);
  395. JobRequisitionItem item = Data.Rows.Where(r => r.Get<JobRequisitionItem, Guid>(c => c.ID).Equals(id)).FirstOrDefault().ToObject<JobRequisitionItem>();
  396. item.Status = status;
  397. item.Notes = item.Notes + Environment.NewLine + note;
  398. new Client<JobRequisitionItem>().Save(item, "Updated From Job Requisition Review Dashboard");
  399. OnGridRefresh?.Invoke();
  400. }
  401. private void SaveItem(JobRequisitionItem item, JobRequisitionItemStatus status, string note)
  402. {
  403. item.Status = status;
  404. item.Notes = item.Notes + Environment.NewLine + note;
  405. new Client<JobRequisitionItem>().Save(item, "Updated From Job Requisition Review Dashboard");
  406. OnGridRefresh?.Invoke();
  407. }
  408. private void MultiSaveRows(CoreRow[] rows, JobRequisitionItemStatus status, string note)
  409. {
  410. List<JobRequisitionItem> items = new List<JobRequisitionItem>();
  411. foreach (CoreRow row in rows)
  412. {
  413. var id = row.Get<JobRequisitionItem, Guid>(c => c.ID);
  414. JobRequisitionItem item = Data.Rows.Where(r => r.Get<JobRequisitionItem, Guid>(c => c.ID).Equals(id)).FirstOrDefault().ToObject<JobRequisitionItem>();
  415. item.Status = status;
  416. item.Notes = item.Notes + Environment.NewLine + note;
  417. items.Add(item);
  418. }
  419. new Client<JobRequisitionItem>().Save(items, "Updated From Job Requisition Review Dashboard");
  420. OnGridRefresh?.Invoke();
  421. }
  422. protected override void Reload(Filters<JobRequisitionItem> criteria, Columns<JobRequisitionItem> columns, ref SortOrder<JobRequisitionItem> sort,
  423. Action<CoreTable, Exception> action)
  424. {
  425. criteria.Add(new Filter<JobRequisitionItem>(x => x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue));
  426. if (!bViewCancelled)
  427. criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Cancelled));
  428. if (!bIncludeArchived)
  429. criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Archived));
  430. if (filterProductIDs.Count > 0)
  431. {
  432. Filter<JobRequisitionItem> filter = new Filter<JobRequisitionItem>(x => x.Product.ID).IsEqualTo(filterProductIDs.FirstOrDefault());
  433. foreach (Guid id in filterProductIDs)
  434. {
  435. if (id != filterProductIDs[0])
  436. filter = filter.Or(x => x.Product.ID).IsEqualTo(id);
  437. }
  438. criteria.Add(filter);
  439. }
  440. sort = new SortOrder<JobRequisitionItem>(x => x.Requisition.Number, SortDirection.Descending);
  441. base.Reload(criteria, columns, ref sort, action);
  442. }
  443. public void RefreshOnFilterChanged(Guid id)
  444. {
  445. filterProductIDs.Clear();
  446. if (id != Guid.Empty)
  447. {
  448. CoreTable table = new Client<SupplierProduct>().Query(
  449. new Filter<SupplierProduct>(x => x.SupplierLink.ID).IsEqualTo(id)
  450. .And(x => x.Product).LinkValid(),
  451. new Columns<SupplierProduct>(x => x.Product.ID));
  452. if (table.Rows.Any())
  453. {
  454. foreach (CoreRow row in table.Rows)
  455. {
  456. filterProductIDs.Add(Guid.Parse(row.Values[0].ToString()));
  457. }
  458. }
  459. }
  460. OnGridRefresh?.Invoke();
  461. }
  462. private void BuildMenu(DynamicMenuColumn column, CoreRow row)
  463. {
  464. column.AddItem("Treatment Required", PRSDesktop.Resources.palette, TreatmentRequired_Clicked);
  465. column.AddItem("Order Required", PRSDesktop.Resources.purchase, OrderRequired_Clicked);
  466. column.AddItem("Mark as Not Checked", PRSDesktop.Resources.disabled, Uncheck_Clicked);
  467. column.AddItem("Split Line", PRSDesktop.Resources.split, SplitLine_Clicked);
  468. column.AddItem("Archive", PRSDesktop.Resources.archive, Archive_Clicked);
  469. }
  470. #endregion
  471. }
  472. public class JobRequiReviewDashboardFilterItem
  473. {
  474. public Guid SupplierID { get; set; }
  475. public Guid ProductID { get; set; }
  476. public string Text { get; set; }
  477. public JobRequiReviewDashboardFilterItem()
  478. {
  479. SupplierID = Guid.Empty;
  480. ProductID = Guid.Empty;
  481. Text = "";
  482. }
  483. }
  484. }