SupplierPurchaseOrders.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Media.Imaging;
  8. using Comal.Classes;
  9. using InABox.Clients;
  10. using InABox.Configuration;
  11. using InABox.Core;
  12. using InABox.DynamicGrid;
  13. using InABox.WPF;
  14. namespace PRSDesktop;
  15. public class SupplierPurchaseOrdersSettings : IUserConfigurationSettings
  16. {
  17. [Obsolete]
  18. private CoreFilterDefinition? _currentFilter;
  19. [Obsolete]
  20. public CoreFilterDefinition? CurrentFilter
  21. {
  22. get => _currentFilter;
  23. set
  24. {
  25. if (value is not null)
  26. {
  27. Filters = new DynamicGridSelectedFilterSettings(new List<ICoreFilterDefinition> { value }, false, null);
  28. }
  29. }
  30. }
  31. public DynamicGridSelectedFilterSettings Filters { get; set; } = new();
  32. }
  33. public class SupplierPurchaseOrders : DynamicDataGrid<PurchaseOrder>
  34. {
  35. private readonly Button close;
  36. private SupplierPurchaseOrdersSettings _settings;
  37. public BitmapImage _truck = PRSDesktop.Resources.truck.AsBitmapImage();
  38. public BitmapImage _tick = PRSDesktop.Resources.tick.AsBitmapImage();
  39. public BitmapImage _warning = PRSDesktop.Resources.warning.AsBitmapImage();
  40. public SupplierPurchaseOrders()
  41. {
  42. _settings = new UserConfiguration<SupplierPurchaseOrdersSettings>().Load();
  43. FilterComponent.SetSettings(_settings.Filters, false);
  44. FilterComponent.OnFiltersSelected += FilterComponent_OnFilterSelected;
  45. OnEditorValueChanged += SupplierPurchaseOrders_OnEditorValueChanged;
  46. OnCustomiseEditor += SupplierPurchaseOrders_OnCustomiseEditor;
  47. HiddenColumns.Add(x => x.IssuedDate);
  48. HiddenColumns.Add(x => x.ClosedDate);
  49. HiddenColumns.Add(x => x.Balance);
  50. HiddenColumns.Add(x => x.Unreceived);
  51. HiddenColumns.Add(x => x.Received);
  52. ActionColumns.Add(new DynamicImageColumn(IssuedStatus));
  53. ActionColumns.Add(new DynamicImageColumn(ReceivedStatus));
  54. PostUtils.AddPostColumn(this);
  55. close = AddButton("Close Order", null, CloseOrder);
  56. close.IsEnabled = false;
  57. }
  58. private BitmapImage? IssuedStatus(CoreRow? row)
  59. {
  60. return row == null
  61. ? _tick
  62. : !row.Get<PurchaseOrder, DateTime>(x => x.IssuedDate).IsEmpty()
  63. ? _tick
  64. : null;
  65. }
  66. private BitmapImage? ReceivedStatus(CoreRow? row)
  67. {
  68. return row == null
  69. ? _truck
  70. : row.Get<PurchaseOrder, double>(x => x.Unreceived).IsEffectivelyEqual(0.0)
  71. ? _tick
  72. : !row.Get<PurchaseOrder, double>(x => x.Received).IsEffectivelyEqual(0.0)
  73. ? _warning
  74. : null;
  75. }
  76. protected override void DoReconfigure(DynamicGridOptions options)
  77. {
  78. base.DoReconfigure(options);
  79. options.RecordCount = true;
  80. options.FilterRows = true;
  81. options.SelectColumns = true;
  82. }
  83. private void SupplierPurchaseOrders_OnCustomiseEditor(IDynamicEditorForm sender, PurchaseOrder[]? items, DynamicGridColumn column, BaseEditor editor)
  84. {
  85. if(column.ColumnName == nameof(PurchaseOrder.ClosedDate))
  86. {
  87. editor.Editable = Security.CanEdit<PurchaseOrder>() && Security.IsAllowed<CanOpenAndClosePurchaseOrders>()
  88. ? Editable.Enabled : Editable.Disabled;
  89. }
  90. }
  91. protected override void DoReconfigureEditors(DynamicEditorGrid grid, PurchaseOrder[] items)
  92. {
  93. base.DoReconfigureEditors(grid, items);
  94. var closedEditor = grid.FindEditor(nameof(PurchaseOrder.ClosedDate));
  95. if(closedEditor is not null)
  96. {
  97. closedEditor.IsEnabled = Security.CanEdit<PurchaseOrder>() && Security.IsAllowed<CanOpenAndClosePurchaseOrders>();
  98. }
  99. }
  100. protected override void BeforeLoad(IDynamicEditorForm form, PurchaseOrder[] items)
  101. {
  102. base.BeforeLoad(form, items);
  103. foreach (var page in form.Pages ?? Enumerable.Empty<IDynamicEditorPage>())
  104. {
  105. page.ReadOnly = items.Any(x => !x.ClosedDate.IsEmpty());
  106. }
  107. }
  108. private Dictionary<string, object?> SupplierPurchaseOrders_OnEditorValueChanged(IDynamicEditorForm sender, string name, object value)
  109. {
  110. var result = new Dictionary<string, object?>();
  111. if(name == nameof(PurchaseOrder.ClosedDate) && value is DateTime closed)
  112. {
  113. foreach (var page in sender.Pages ?? Enumerable.Empty<IDynamicEditorPage>())
  114. {
  115. page.ReadOnly = !closed.IsEmpty();
  116. }
  117. }
  118. //try
  119. //{
  120. // var form = sender as DynamicEditorForm;
  121. // var itemspage = form?.Pages.FirstOrDefault(x => x is DynamicOneToManyGrid<PurchaseOrder, PurchaseOrderItem>) as DynamicOneToManyGrid<PurchaseOrder, PurchaseOrderItem>;
  122. // if ((itemspage == null) || (itemspage.Items.Count == 0))
  123. // return result;
  124. // if (name.Equals("DueDate") && (MessageBox.Show("Update Due Date on existing items?", "Alert", MessageBoxButton.YesNo) == MessageBoxResult.Yes))
  125. // {
  126. // foreach (var item in itemspage.Items)
  127. // item.DueDate = Convert.ToDateTime(value);
  128. // itemspage.Refresh(false, true);
  129. // }
  130. // else if (name.Equals("SupplierLink.ID") &&
  131. // (MessageBox.Show("Update Supplier Pricing to existihg items?", "Alert", MessageBoxButton.YesNo) == MessageBoxResult.Yes))
  132. // {
  133. // PurchaseOrder.UpdateCosts(itemspage.Items, (Guid)value, null);
  134. // // var productids = itemspage.Items.Where(x => x.Product.ID != Guid.Empty).Select(x => x.Product.ID).ToArray();
  135. // // MultiQuery query = new MultiQuery();
  136. // // query.Add(
  137. // // new Filter<SupplierProduct>(x=>x.SupplierLink.ID).IsEqualTo(value).And(x=>x.ProductLink.ID).InList(productids),
  138. // // new Columns<SupplierProduct>(x=>x.ProductLink.ID).Add(x=>x.Job.ID).Add(x=>x.CostPrice)
  139. // // );
  140. // // query.Add(
  141. // // new Filter<Product>(x=>x.ID).InList(productids),
  142. // // new Columns<Product>(x=>x.ID).Add(x=>x.NettCost)
  143. // // );
  144. // // query.Query();
  145. // //
  146. // // foreach (var item in itemspage.Items)
  147. // // {
  148. // // CoreRow? row = query.Get<SupplierProduct>()?.Rows.FirstOrDefault(r =>
  149. // // (r.Get<SupplierProduct, Guid>(c => c.ProductLink.ID) == item.Product.ID)
  150. // // && (r.Get<SupplierProduct, Guid>(c => c.Job.ID) == item.Job.ID)
  151. // // );
  152. // // if (row == null)
  153. // // row = query.Get<SupplierProduct>()?.Rows.FirstOrDefault(r =>
  154. // // (r.Get<SupplierProduct, Guid>(c => c.ProductLink.ID) == item.Product.ID)
  155. // // && (r.Get<SupplierProduct, Guid>(c => c.Job.ID) == Guid.Empty)
  156. // // );
  157. // // if (row != null)
  158. // // item.Cost = row.Get<SupplierProduct, double>(c => c.CostPrice);
  159. // // else
  160. // // {
  161. // // row = query.Get<Product>()?.Rows.FirstOrDefault(r =>
  162. // // (r.Get<Product, Guid>(c => c.ID) == item.Product.ID)
  163. // // );
  164. // // if (row != null)
  165. // // item.Cost = row.Get<Product, double>(c => c.NettCost);
  166. // // }
  167. // //
  168. // // }
  169. // itemspage.Refresh(false, true);
  170. // }
  171. //}
  172. //catch
  173. //{ }
  174. return result;
  175. }
  176. // private List<SupplierProduct> GetSupplierProducts(object value)
  177. // {
  178. // List<SupplierProduct> supplierProducts = new List<SupplierProduct>();
  179. // CoreTable supplierProductstable = new Client<SupplierProduct>().Query(new Filter<SupplierProduct>(x => x.SupplierLink.ID).IsEqualTo(Guid.Parse(value.ToString())),
  180. // new Columns<SupplierProduct>(
  181. // x => x.ID,
  182. // x => x.SupplierLink.ID,
  183. // x => x.ProductLink.ID,
  184. // x => x.Job.ID,
  185. // x => x.TradePrice));
  186. // if (supplierProductstable.Rows.Any())
  187. // {
  188. // foreach (CoreRow row in supplierProductstable.Rows)
  189. // {
  190. // SupplierProduct supplierProduct = row.ToObject<SupplierProduct>();
  191. // supplierProducts.Add(supplierProduct);
  192. // }
  193. // }
  194. // return supplierProducts;
  195. // }
  196. protected override void SelectItems(CoreRow[]? rows)
  197. {
  198. close.IsEnabled = rows != null && rows.Any(r =>
  199. r.Get<PurchaseOrder, DateTime>(c => c.ClosedDate).IsEmpty() && r.Get<PurchaseOrder, double>(x => x.Balance).Equals(0.0F));
  200. base.SelectItems(rows);
  201. }
  202. private bool CloseOrder(Button arg1, CoreRow[] arg2)
  203. {
  204. var orders = new List<PurchaseOrder>();
  205. foreach (var row in arg2)
  206. {
  207. var order = row.ToObject<PurchaseOrder>();
  208. order.ClosedDate = DateTime.Now;
  209. orders.Add(order);
  210. }
  211. new Client<PurchaseOrder>().Save(orders, "Marking Order as Closed");
  212. return true;
  213. }
  214. public PurchaseOrder[] LoadOrders(CoreRow[] rows)
  215. {
  216. return LoadItems(rows);
  217. }
  218. private void FilterComponent_OnFilterSelected(DynamicGridSelectedFilterSettings settings)
  219. {
  220. _settings.Filters = settings;
  221. new UserConfiguration<SupplierPurchaseOrdersSettings>().Save(_settings);
  222. }
  223. }