JobRequisitionPurchasing.xaml.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. using Comal.Classes;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using InABox.DynamicGrid;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.ComponentModel;
  9. using System.Linq;
  10. using System.Windows.Controls;
  11. namespace PRSDesktop;
  12. /// <summary>
  13. /// Interaction logic for JobRequisitionPurchasing.xaml
  14. /// </summary>
  15. public partial class JobRequisitionPurchasing : UserControl
  16. {
  17. public delegate void PurchaseOrderSaved();
  18. public event PurchaseOrderSaved? OnPurchaseOrderSaved;
  19. private PurchaseOrder Order { get; set; } = new PurchaseOrder();
  20. private List<JobRequiItemLinking> JobRequiItems = new List<JobRequiItemLinking>();
  21. private class JobRequiItemLinking
  22. {
  23. public JobRequisitionItem JobRequiItem { get; set; }
  24. public JobRequisitionItemPurchaseOrderItem? JobRequisitionItemPurchaseOrderItem { get; set; }
  25. public PurchaseOrderItem? PurchaseOrderItem { get; set; }
  26. public JobRequiItemLinking(JobRequisitionItem jobRequiItem, PurchaseOrderItem purchaseOrderItem)
  27. {
  28. JobRequiItem = jobRequiItem;
  29. PurchaseOrderItem = purchaseOrderItem;
  30. JobRequisitionItemPurchaseOrderItem = null;
  31. }
  32. public JobRequiItemLinking(JobRequisitionItem jobRequiItem, JobRequisitionItemPurchaseOrderItem jobRequisitionItemPurchaseOrderItem)
  33. {
  34. JobRequiItem = jobRequiItem;
  35. PurchaseOrderItem = null;
  36. JobRequisitionItemPurchaseOrderItem = jobRequisitionItemPurchaseOrderItem;
  37. }
  38. }
  39. bool bLoaded = false;
  40. public bool EditorChanged { get; private set; }
  41. public JobRequisitionPurchasing()
  42. {
  43. InitializeComponent();
  44. CreatePOEditor();
  45. }
  46. private void ReloadJobRequiItems(Guid orderID)
  47. {
  48. JobRequiItems.Clear();
  49. if(orderID != Guid.Empty)
  50. {
  51. var poItems = Client.Query(
  52. new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.PurchaseOrderLink.ID)
  53. .IsEqualTo(orderID),
  54. new Columns<JobRequisitionItemPurchaseOrderItem>(x => x.ID).Add(x => x.JobRequisitionItem.ID))
  55. .ToObjects<JobRequisitionItemPurchaseOrderItem>();
  56. foreach (var jriPoi in poItems)
  57. {
  58. var jri = new JobRequisitionItem
  59. {
  60. ID = jriPoi.JobRequisitionItem.ID
  61. };
  62. JobRequiItems.Add(new JobRequiItemLinking(jri, jriPoi));
  63. }
  64. }
  65. }
  66. public void LoadFromRequiLine(Guid orderID)
  67. {
  68. if (bLoaded)
  69. return;
  70. ReloadJobRequiItems(orderID);
  71. if (orderID != Guid.Empty)
  72. {
  73. if (orderID != Order.ID)
  74. {
  75. LoadPO(orderID);
  76. }
  77. }
  78. else
  79. ClearEditor();
  80. }
  81. private void LoadPO(Guid orderID)
  82. {
  83. var po = Client.Query(
  84. new Filter<PurchaseOrder>(x => x.ID).IsEqualTo(orderID),
  85. new Columns<PurchaseOrder>(
  86. x => x.ID,
  87. x => x.SupplierLink.ID,
  88. x => x.SupplierLink.Code,
  89. x => x.SupplierLink.Name,
  90. x => x.Description,
  91. x => x.Category.ID,
  92. x => x.Category.Code,
  93. x => x.Category.Description,
  94. x => x.RaisedBy.ID,
  95. x => x.RaisedBy.Code,
  96. x => x.RaisedBy.Name,
  97. x => x.DueDate,
  98. x => x.IssuedBy.ID,
  99. x => x.IssuedBy.Code,
  100. x => x.IssuedBy.Name,
  101. x => x.IssuedDate,
  102. x => x.ClosedDate,
  103. x => x.PONumber))
  104. .ToObjects<PurchaseOrder>().FirstOrDefault();
  105. if (po is not null)
  106. {
  107. Order = po;
  108. CreatePOEditor(new BaseObject[] { po });
  109. }
  110. }
  111. private void CreatePOEditor(BaseObject[]? items = null)
  112. {
  113. DetailBorder.Child = null;
  114. Editor = new EmbeddedDynamicEditorForm();
  115. Editor.SetLayoutType<VerticalDynamicEditorGridLayout>();
  116. Editor.SetValue(Grid.RowProperty, 1);
  117. Editor.SetValue(Grid.ColumnProperty, 0);
  118. Editor.SetValue(Grid.ColumnSpanProperty, 4);
  119. Editor.HighlightButtons = true;
  120. Editor.HideButtons = true;
  121. EditorChanged = false;
  122. Editor.OnAfterEditorValueChanged += (sender, args) =>
  123. {
  124. EditorChanged = true;
  125. Editor.HideButtons = false;
  126. return null;
  127. };
  128. Editor.OnOK += () =>
  129. {
  130. var cancel = new System.ComponentModel.CancelEventArgs();
  131. Editor.SaveItem(cancel);
  132. Editor.HideButtons = true;
  133. SaveJRIPOIs();
  134. OnPurchaseOrderSaved?.Invoke();
  135. EditorChanged = false;
  136. bLoaded = false;
  137. };
  138. Editor.OnCancel += () =>
  139. {
  140. Editor.HideButtons = true;
  141. bLoaded = false;
  142. var orderID = Order.ID;
  143. Order = new PurchaseOrder();
  144. JobRequiItems.Clear();
  145. LoadFromRequiLine(orderID);
  146. EditorChanged = false;
  147. };
  148. Editor.OnChanged += (sender, args) =>
  149. {
  150. EditorChanged = true;
  151. Editor.HideButtons = false;
  152. };
  153. DetailBorder.Child = Editor;
  154. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(PurchaseOrder));
  155. grid.InitialiseEditorForm(Editor, items ?? new object[] { new PurchaseOrder() });
  156. var loadPO = new Button
  157. {
  158. Content = "Load PO",
  159. Height = 30,
  160. Margin = new System.Windows.Thickness(2, 0, 0, 0),
  161. Padding = new System.Windows.Thickness(15, 0, 15, 0)
  162. };
  163. loadPO.Click += LoadPO_Click;
  164. Editor.AddButton(loadPO);
  165. }
  166. private void LoadPO_Click(object sender, System.Windows.RoutedEventArgs e)
  167. {
  168. var popup = new PopupList(typeof(PurchaseOrder), Guid.Empty, Array.Empty<string>());
  169. if(popup.ShowDialog() == true)
  170. {
  171. bLoaded = true;
  172. LoadPO(popup.ID);
  173. }
  174. }
  175. private void SaveJRIPOIs()
  176. {
  177. var toSave = new List<JobRequisitionItemPurchaseOrderItem>();
  178. foreach(var item in JobRequiItems)
  179. {
  180. if(item.PurchaseOrderItem is not null)
  181. {
  182. var jriPoi = new JobRequisitionItemPurchaseOrderItem();
  183. jriPoi.JobRequisitionItem.ID = item.JobRequiItem.ID;
  184. jriPoi.PurchaseOrderItem.ID = item.PurchaseOrderItem.ID;
  185. toSave.Add(jriPoi);
  186. item.JobRequisitionItemPurchaseOrderItem = jriPoi;
  187. }
  188. }
  189. Client.Save(
  190. toSave,
  191. "Updated from Job Requi Review Create Purchase Order");
  192. }
  193. private void ClearEditor()
  194. {
  195. Order = new PurchaseOrder();
  196. CreatePOEditor();
  197. }
  198. public void DropItems(IEnumerable<CoreRow> rows)
  199. {
  200. var page = Editor.Pages.OfType<SupplierPurchaseOrderItemOneToMany>().First();
  201. if(CreatePOItemsFromRequiItems(rows.ToObjects<JobRequisitionItem>(), page.Items))
  202. {
  203. page.Refresh(false, true);
  204. page.DoChanged();
  205. }
  206. }
  207. private bool CreatePOItemsFromRequiItems(IEnumerable<JobRequisitionItem> selected, List<PurchaseOrderItem> items)
  208. {
  209. var changed = false;
  210. foreach (var jobRequisitionItem in selected)
  211. {
  212. // We only want not checked or order required.
  213. if(jobRequisitionItem.Status != JobRequisitionItemStatus.NotChecked &&
  214. jobRequisitionItem.Status != JobRequisitionItemStatus.OrderRequired)
  215. {
  216. continue;
  217. }
  218. // Filter out ones we've already got.
  219. if(JobRequiItems.Any(x => x.JobRequiItem.ID == jobRequisitionItem.ID))
  220. {
  221. continue;
  222. }
  223. var poItem = new PurchaseOrderItem
  224. {
  225. Description = jobRequisitionItem.Product.Name,
  226. Qty = jobRequisitionItem.Qty
  227. };
  228. poItem.Product.ID = jobRequisitionItem.Product.ID;
  229. poItem.Product.Synchronise(jobRequisitionItem.Product);
  230. poItem.Dimensions.CopyFrom(jobRequisitionItem.Dimensions);
  231. poItem.Style.ID = jobRequisitionItem.Style.ID;
  232. poItem.Style.Synchronise(jobRequisitionItem.Style);
  233. poItem.Job.ID = jobRequisitionItem.Requisition.Job.ID;
  234. poItem.Job.Synchronise(jobRequisitionItem.Requisition.Job);
  235. items.Add(poItem);
  236. JobRequiItems.Add(new JobRequiItemLinking(jobRequisitionItem, poItem));
  237. changed = true;
  238. }
  239. return changed;
  240. }
  241. }