JobSummaryGrid.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Reflection;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Media;
  9. using Comal.Classes;
  10. using InABox.Clients;
  11. using InABox.Core;
  12. using InABox.DynamicGrid;
  13. using InABox.WPF;
  14. namespace PRSDesktop
  15. {
  16. internal class JobSummaryGrid : DynamicDataGrid<JobMaterial>, IJobControl, IDataModelSource
  17. {
  18. Guid empID = Guid.Empty;
  19. string empName = "";
  20. private bool _stylecolumnVisible;
  21. public bool IncludeReserves { get; set; }
  22. public JobSummaryGrid() : base()
  23. {
  24. ColumnsTag = nameof(JobSummaryGrid);
  25. Options.AddRange(
  26. DynamicGridOption.RecordCount,
  27. DynamicGridOption.SelectColumns,
  28. DynamicGridOption.FilterRows,
  29. DynamicGridOption.ExportData,
  30. DynamicGridOption.MultiSelect
  31. );
  32. HiddenColumns.Add(x => x.Product.ID);
  33. HiddenColumns.Add(x => x.Style.ID);
  34. HiddenColumns.Add(x => x.Dimensions.UnitSize);
  35. HiddenColumns.Add(x => x.BillOfMaterials);
  36. HiddenColumns.Add(x => x.Requisitions);
  37. HiddenColumns.Add(x => x.PickingLists);
  38. HiddenColumns.Add(x => x.Issued);
  39. HiddenColumns.Add(x => x.ReservedStock);
  40. HiddenColumns.Add(x => x.OnOrder);
  41. HiddenColumns.Add(x => x.JobShortage);
  42. HiddenColumns.Add(x => x.FreeOnHand);
  43. HiddenColumns.Add(x => x.FreeOnOrder);
  44. HiddenColumns.Add(x => x.FreeStockTotal);
  45. HiddenColumns.Add(x => x.FreeStockShortage);
  46. HiddenColumns.Add(x => x.Product.Image.ID);
  47. HiddenColumns.Add(x => x.Product.Image.FileName);
  48. ActionColumns.Add(new DynamicImageManagerColumn<JobMaterial>(this, x => x.Product.Image, false)
  49. { Position = DynamicActionColumnPosition.Start });
  50. AddButton("Create PO", null, CreatePO);
  51. OnCellDoubleClick += JobSummaryGrid_OnCellDoubleClick;
  52. }
  53. protected override void GenerateColumns(DynamicGridColumns columns)
  54. {
  55. columns.Add<JobMaterial, string>(x => x.Product.Group.Code, 120, "Group Code", "", Alignment.MiddleCenter);
  56. columns.Add<JobMaterial, string>(x => x.Product.Code, 200, "Product Code", "", Alignment.MiddleCenter);
  57. columns.Add<JobMaterial, string>(x => x.Product.Name, 0, "Product Name", "", Alignment.MiddleCenter);
  58. columns.Add<JobMaterial, string>(x => x.Dimensions.UnitSize, 120, "UOM", "", Alignment.MiddleCenter);
  59. columns.Add<JobMaterial, double>(x => x.BillOfMaterials, 80, "BOM", "", Alignment.MiddleCenter);
  60. columns.Add<JobMaterial, double>(x => x.Requisitions, 80, "Req.", "", Alignment.MiddleCenter);
  61. columns.Add<JobMaterial, double>(x => x.PickingLists, 80, "P/L", "", Alignment.MiddleCenter);
  62. columns.Add<JobMaterial, double>(x => x.Issued, 80, "Issued", "", Alignment.MiddleCenter);
  63. columns.Add<JobMaterial, double>(x => x.ReservedStock, 80, "Reserved", "", Alignment.MiddleCenter);
  64. columns.Add<JobMaterial, double>(x => x.OnOrder, 80, "Ordered", "", Alignment.MiddleCenter);
  65. columns.Add<JobMaterial, double>(x => x.JobShortage, 80, "Job Short", "", Alignment.MiddleCenter);
  66. columns.Add<JobMaterial, double>(x => x.FreeStockTotal, 80, "Free Stock", "", Alignment.MiddleCenter);
  67. columns.Add<JobMaterial, double>(x => x.FreeStockShortage, 80, "Stk Short", "", Alignment.MiddleCenter);
  68. }
  69. private void ShowDetailGrid<TEntity>(
  70. String columnname,
  71. Expression<Func<TEntity,object?>> productcol,
  72. Guid productid,
  73. Expression<Func<TEntity,object?>> stylecol,
  74. Guid? styleid,
  75. Expression<Func<TEntity,object?>> unitcol,
  76. String unitsize,
  77. Expression<Func<TEntity,object?>>? jobcol,
  78. Filter<TEntity>? extrafilter,
  79. Func<CoreRow,bool>? rowfilter
  80. )
  81. {
  82. var grid = (Activator.CreateInstance(typeof(DynamicDataGrid<>).MakeGenericType(typeof(TEntity))) as IDynamicDataGrid);
  83. if (grid == null)
  84. {
  85. MessageBox.Show($"Cannot create Grid for [{typeof(TEntity).Name}]");
  86. return;
  87. }
  88. grid.ColumnsTag = $"{ColumnsTag}.{columnname}";
  89. grid.Options.BeginUpdate().Clear().AddRange(DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns).EndUpdate();
  90. grid.OnDefineFilter += t =>
  91. {
  92. var filter = new Filter<TEntity>(productcol).IsEqualTo(productid)
  93. .And(unitcol).IsEqualTo(unitsize);
  94. if (styleid.HasValue)
  95. filter = filter.And(stylecol).IsEqualTo(styleid);
  96. if (jobcol != null)
  97. filter = filter.And(jobcol).IsEqualTo(ParentID);
  98. if (extrafilter != null)
  99. filter = filter.And(extrafilter);
  100. return filter;
  101. };
  102. grid.OnFilterRecord += row => rowfilter?.Invoke(row) ?? true;
  103. var window = DynamicGridUtils.CreateGridWindow($"Viewing {CoreUtils.Neatify(columnname)} Calculation", (grid as BaseDynamicGrid)!);
  104. window.ShowDialog();
  105. }
  106. private void JobSummaryGrid_OnCellDoubleClick(object sender, DynamicGridCellClickEventArgs args)
  107. {
  108. Guid productid = args.Row.Get<StockSummary, Guid>(c => c.Product.ID);
  109. Guid? styleid = _stylecolumnVisible ? args.Row.Get<StockSummary, Guid>(c => c.Style.ID) : null;
  110. String unitsize = args.Row.Get<StockSummary, String>(c => c.Dimensions.UnitSize);
  111. if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.BillOfMaterials, ".")))
  112. {
  113. ShowDetailGrid<JobBillOfMaterialsItem>(
  114. args.Column.ColumnName,
  115. x => x.Product.ID,
  116. productid,
  117. x => x.Style.ID,
  118. styleid,
  119. x=>x.Dimensions.UnitSize,
  120. unitsize,
  121. x => x.Job.ID,
  122. new Filter<JobBillOfMaterialsItem>(x=>x.BillOfMaterials.Approved).IsNotEqualTo(DateTime.MinValue),
  123. null
  124. );
  125. }
  126. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.Requisitions, ".")))
  127. {
  128. ShowDetailGrid<JobRequisitionItem>(
  129. args.Column.ColumnName,
  130. x => x.Product.ID,
  131. productid,
  132. x => x.Style.ID,
  133. styleid,
  134. x=>x.Dimensions.UnitSize,
  135. unitsize,
  136. x => x.Job.ID,
  137. new Filter<JobRequisitionItem>(x=>x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue),
  138. null
  139. );
  140. }
  141. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.PickingLists, ".")))
  142. {
  143. ShowDetailGrid<RequisitionItem>(
  144. args.Column.ColumnName,
  145. x => x.Product.ID,
  146. productid,
  147. x => x.Style.ID,
  148. styleid,
  149. x=>x.Dimensions.UnitSize,
  150. unitsize,
  151. x => x.Job.ID,
  152. new Filter<RequisitionItem>(x=>x.RequisitionLink.Filled).IsEqualTo(DateTime.MinValue),
  153. null
  154. );
  155. }
  156. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.Issued, ".")))
  157. {
  158. ShowDetailGrid<StockMovement>(
  159. args.Column.ColumnName,
  160. x => x.Product.ID,
  161. productid,
  162. x => x.Style.ID,
  163. styleid,
  164. x=>x.Dimensions.UnitSize,
  165. unitsize,
  166. x => x.Job.ID,
  167. new Filter<StockMovement>(x=>x.IsTransfer).IsEqualTo(false).And(x=>x.Issued).IsNotEqualTo(0.0F),
  168. null
  169. );
  170. }
  171. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.ReservedStock, ".")))
  172. {
  173. ShowDetailGrid<StockHolding>(
  174. args.Column.ColumnName,
  175. x => x.Product.ID,
  176. productid,
  177. x => x.Style.ID,
  178. styleid,
  179. x=>x.Dimensions.UnitSize,
  180. unitsize,
  181. x=>x.Job.ID,
  182. new Filter<StockHolding>(x => x.Units).IsGreaterThan(0.1),
  183. null
  184. );
  185. }
  186. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.OnOrder, ".")))
  187. {
  188. ShowDetailGrid<PurchaseOrderItem>(
  189. args.Column.ColumnName,
  190. x => x.Product.ID,
  191. productid,
  192. x => x.Style.ID,
  193. styleid,
  194. x=>x.Dimensions.UnitSize,
  195. unitsize,
  196. x=>x.Job.ID,
  197. null,
  198. null
  199. );
  200. }
  201. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.FreeOnHand, ".")))
  202. {
  203. ShowDetailGrid<StockHolding>(
  204. args.Column.ColumnName,
  205. x => x.Product.ID,
  206. productid,
  207. x => x.Style.ID,
  208. styleid,
  209. x=>x.Dimensions.UnitSize,
  210. unitsize,
  211. null,
  212. new Filter<StockHolding>(x=>x.Units).IsNotEqualTo(0.0F)
  213. .And(
  214. IncludeReserves
  215. ? new Filter<StockHolding>(x=>x.Job.ID).IsNotEqualTo(ParentID)
  216. : new Filter<StockHolding>(x=>x.Job.JobStatus.Active).IsEqualTo(false)
  217. ),
  218. null
  219. );
  220. }
  221. else if (String.Equals(args.Column.ColumnName, CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.FreeOnOrder, ".")))
  222. {
  223. ShowDetailGrid<PurchaseOrderItem>(
  224. args.Column.ColumnName,
  225. x => x.Product.ID,
  226. productid,
  227. x => x.Style.ID,
  228. styleid,
  229. x=>x.Dimensions.UnitSize,
  230. unitsize,
  231. null,
  232. IncludeReserves
  233. ? new Filter<PurchaseOrderItem>(x=>x.Job.ID).IsNotEqualTo(ParentID)
  234. : new Filter<PurchaseOrderItem>(x=>x.Job.JobStatus.Active).IsEqualTo(false),
  235. null
  236. );
  237. }
  238. }
  239. public event DataModelUpdateEvent OnUpdateDataModel;
  240. public string SectionName => "Job Summary";
  241. public DataModel DataModel(Selection selection)
  242. {
  243. return new AutoDataModel<JobMaterial>(new Filter<JobMaterial>(x => x.Job.ID).IsEqualTo(ParentID));
  244. }
  245. public Guid ParentID { get; set; }
  246. public JobPanelSettings Settings { get; set; }
  247. protected override JobMaterial CreateItem()
  248. {
  249. var result = base.CreateItem();
  250. result.Job.ID = ParentID;
  251. return result;
  252. }
  253. private Tuple<Guid,Guid,Guid?,String>[] GetKeys(IEnumerable<CoreRow> rows, Columns<JobMaterial> columns, bool hasstyle)
  254. {
  255. int jobcol = columns.IndexOf(x => x.Job.ID);
  256. int productcol = columns.IndexOf(x => x.Product.ID);
  257. int stylecol = hasstyle ? columns.IndexOf(x => x.Style.ID) : -1;
  258. int unitcol = columns.IndexOf(x => x.Dimensions.UnitSize);
  259. var result = rows.Select(r => new Tuple<Guid, Guid, Guid?, String>(
  260. (Guid)(r.Values[jobcol] ?? Guid.Empty),
  261. (Guid)(r.Values[productcol] ?? Guid.Empty),
  262. (stylecol != -1) ? (Guid)(r.Values[stylecol] ?? Guid.Empty) : null,
  263. (String)(r.Values[unitcol] ?? ""))
  264. ).Distinct().ToArray();
  265. return result;
  266. }
  267. private CoreRow[] GetRows<TSource>(IEnumerable<CoreRow> rows, Columns<TSource> columns, Guid? jobid, Guid productid, Guid? styleid, String unitsize, Func<CoreRow,bool>? extrafilter = null) where TSource : IJobMaterial
  268. {
  269. int jobcol = columns.IndexOf(x => x.Job.ID);
  270. int productcol = columns.IndexOf(x => x.Product.ID);
  271. int stylecol = styleid.HasValue ? columns.IndexOf(x => x.Style.ID) : -1;
  272. int unitcol = columns.IndexOf(x => x.Dimensions.UnitSize);
  273. var subset = rows
  274. .Where(r=>
  275. (!jobid.HasValue || Guid.Equals(r.Values[jobcol], jobid))
  276. && Guid.Equals(r.Values[productcol], productid)
  277. && (!styleid.HasValue || Guid.Equals(r.Values[stylecol], styleid))
  278. && String.Equals(r.Values[unitcol], unitsize)
  279. && ((extrafilter == null) || extrafilter(r) )
  280. );
  281. return subset.ToArray();
  282. }
  283. private double Aggregate<TSource>(IEnumerable<CoreRow> rows, Columns<TSource> columns, bool hasstyle, bool hasjob, Expression<Func<TSource, object>> source, CoreRow target, Expression<Func<JobMaterial, object>> aggregate )
  284. {
  285. int srcol = columns.IndexOf(source);
  286. if (srcol == -1)
  287. return 0.00;
  288. var total = rows.Aggregate(0d, (value, row) => value + (double)(row.Values[srcol] ?? 0.0d));
  289. target.Set(aggregate, total);
  290. return total;
  291. }
  292. protected override void Reload(Filters<JobMaterial> criteria, Columns<JobMaterial> columns, ref SortOrder<JobMaterial>? sort,
  293. Action<CoreTable?, Exception?> action)
  294. {
  295. Filter<JobMaterial>? filter = ParentID == Guid.Empty
  296. ? new Filter<JobMaterial>().None()
  297. : new Filter<JobMaterial>(x => x.Job.ID).IsEqualTo(ParentID)
  298. .And(x => x.Product.ID).IsNotEqualTo(Guid.Empty);
  299. var orderby = sort;
  300. Progress.ShowModal("Loading Data",
  301. (progress) =>
  302. {
  303. CoreTable table = new CoreTable();
  304. table.LoadColumns(columns);
  305. var data = new Client<JobMaterial>().Query(filter, columns, orderby);
  306. var pids = data.ExtractValues<JobMaterial, Guid>(x => x.Product.ID).ToArray();
  307. if (pids.Any())
  308. {
  309. MultiQuery query = new MultiQuery();
  310. query.Add<StockHolding>(
  311. new Filter<StockHolding>(x => x.Product.ID).InList(pids)
  312. .And(x => x.Units).IsNotEqualTo(0.0F)
  313. .And(new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Guid.Empty).Or(x=>x.Job.ID).IsNotEqualTo(ParentID)),
  314. new Columns<StockHolding>(x => x.Product.ID)
  315. .Add(x => x.Style.ID)
  316. .Add(x => x.Dimensions.UnitSize)
  317. .Add(x => x.Units)
  318. .Add(x => x.Job.ID)
  319. .Add(x => x.Job.JobStatus.Active)
  320. );
  321. query.Add<PurchaseOrderItem>(
  322. new Filter<PurchaseOrderItem>(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue)
  323. .And(x => x.Product.ID).InList(pids)
  324. .And(new Filter<PurchaseOrderItem>(x => x.Job.ID).IsEqualTo(Guid.Empty).Or(x=>x.Job.ID).IsNotEqualTo(ParentID)),
  325. new Columns<PurchaseOrderItem>(x => x.Product.ID)
  326. .Add(x => x.Style.ID)
  327. .Add(x => x.Dimensions.UnitSize)
  328. .Add(x => x.Qty)
  329. .Add(x => x.Job.ID)
  330. .Add(x => x.Job.JobStatus.Active)
  331. );
  332. query.Query();
  333. var freestock = query.Get<StockHolding>();
  334. Columns<StockHolding> freestockcolumns = new Columns<StockHolding>(freestock.Columns.Select(x => x.ColumnName));
  335. var freeorders = query.Get<PurchaseOrderItem>();
  336. Columns<PurchaseOrderItem> freeordercolumns = new Columns<PurchaseOrderItem>(freeorders.Columns.Select(x => x.ColumnName));
  337. var keys = GetKeys(data.Rows, columns, _stylecolumnVisible);
  338. foreach (var key in keys)
  339. {
  340. var rows = GetRows(data.Rows, columns, key.Item1, key.Item2, key.Item3, key.Item4);
  341. if (rows.Any())
  342. {
  343. CoreRow newrow = table.NewRow();
  344. newrow.LoadValues(rows.First().Values);
  345. var bom = Aggregate(rows, columns, _stylecolumnVisible, true, x => x.BillOfMaterials, newrow,
  346. x => x.BillOfMaterials);
  347. var requi = Aggregate(rows, columns, _stylecolumnVisible, true, x => x.Requisitions, newrow, x => x.Requisitions);
  348. var picklist = Aggregate(rows, columns, _stylecolumnVisible, true, x => x.PickingLists, newrow,
  349. x => x.PickingLists);
  350. var issued = Aggregate(rows, columns, _stylecolumnVisible, true, x => x.Issued, newrow, x => x.Issued);
  351. var reserved = Aggregate(rows, columns, _stylecolumnVisible, true, x => x.ReservedStock, newrow,
  352. x => x.ReservedStock);
  353. var ordered = Aggregate(rows, columns, _stylecolumnVisible, true, x => x.OnOrder, newrow, x => x.OnOrder);
  354. var shortage = Math.Max(0, Math.Max(0, (requi - issued)) - (reserved + ordered));
  355. newrow.Set<JobMaterial, double>(x => x.JobShortage, shortage);
  356. var freestockrows = GetRows(freestock.Rows, freestockcolumns, null, key.Item2, key.Item3, key.Item4,
  357. IncludeReserves ? null : (r) => !r.Get<StockHolding,bool>(x=>x.Job.JobStatus.Active));
  358. var freeonhand = Aggregate(freestockrows, freestockcolumns, _stylecolumnVisible, false, x => x.Units, newrow,
  359. x => x.FreeOnHand);
  360. newrow.Set<JobMaterial, double>(x => x.FreeOnHand, freeonhand);
  361. var freeorderrows = GetRows(freeorders.Rows, freeordercolumns, null, key.Item2, key.Item3, key.Item4,
  362. IncludeReserves ? null : (r) => !r.Get<PurchaseOrderItem,bool>(x=>x.Job.JobStatus.Active));
  363. var freeonorder = Aggregate(freeorderrows, freeordercolumns, _stylecolumnVisible, false, x => x.Qty, newrow,
  364. x => x.FreeOnOrder);
  365. newrow.Set<JobMaterial, double>(x => x.FreeOnOrder, freeonorder);
  366. newrow.Set<JobMaterial, double>(x => x.FreeStockTotal, freeonhand + freeonorder);
  367. newrow.Set<JobMaterial, double>(x => x.FreeStockShortage, Math.Max(0, shortage - (freeonhand + freeonorder)));
  368. table.Rows.Add(newrow);
  369. }
  370. }
  371. }
  372. action?.Invoke(table, null);
  373. }
  374. );
  375. }
  376. protected override bool FilterRecord(CoreRow row)
  377. {
  378. var result = base.FilterRecord(row)
  379. && (
  380. row.Get<JobMaterial, double>(x => x.BillOfMaterials) != 0.0F ||
  381. row.Get<JobMaterial, double>(x => x.Requisitions) != 0.0F ||
  382. row.Get<JobMaterial, double>(x => x.PickingLists) != 0.0F ||
  383. row.Get<JobMaterial, double>(x => x.Issued) != 0.0F ||
  384. row.Get<JobMaterial, double>(x => x.ReservedStock) != 0.0F ||
  385. row.Get<JobMaterial, double>(x => x.OnOrder) != 0.0F
  386. );
  387. return result;
  388. }
  389. private String _jobshortage = CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.JobShortage, ".");
  390. private String _stockshortage = CoreUtils.GetFullPropertyName<JobMaterial, double>(x => x.FreeStockShortage, ".");
  391. protected override Brush? GetCellBackground(CoreRow row, string columnname)
  392. {
  393. if (String.Equals(columnname, _jobshortage))
  394. return row.Get<JobMaterial, double>(x => x.JobShortage) > 0.0F ? new SolidColorBrush(Colors.LightSalmon) { Opacity = 0.5 } : null;
  395. if (String.Equals(columnname, _stockshortage))
  396. return row.Get<JobMaterial, double>(x => x.FreeStockShortage) > 0.0F ? new SolidColorBrush(Colors.LightSalmon) { Opacity = 0.5 } : null;
  397. return null;
  398. }
  399. #region Create PO
  400. private void GetEmpID()
  401. {
  402. 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));
  403. if (table.Rows.Any())
  404. {
  405. empID = Guid.Parse(table.Rows.FirstOrDefault().Values[0].ToString());
  406. empName = table.Rows.FirstOrDefault().Values[1].ToString();
  407. }
  408. }
  409. private bool CreatePO(System.Windows.Controls.Button btn, CoreRow[] rows)
  410. {
  411. if (!rows.Any())
  412. {
  413. MessageBox.Show("Please select at least one row to add to PO");
  414. return false;
  415. }
  416. PurchaseOrder purchaseOrder = new PurchaseOrder();
  417. purchaseOrder.Notes = "Created from Job Summary Screen" + System.Environment.NewLine;
  418. purchaseOrder.RaisedBy.ID = empID;
  419. var page = new SupplierPurchaseOrders();
  420. page.OnAfterSave += (form, items) =>
  421. {
  422. MessageBox.Show("Success - New Purchase Order Created (" + purchaseOrder.PONumber + ")");
  423. };
  424. return page.EditItems(new[] { purchaseOrder }, LoadPurchaseOrderItems, true);
  425. }
  426. private CoreTable LoadPurchaseOrderItems(Type arg)
  427. {
  428. Progress.Show("Working");
  429. var result = new CoreTable();
  430. result.LoadColumns(typeof(PurchaseOrderItem));
  431. List<PurchaseOrderItem> items = new List<PurchaseOrderItem>();
  432. foreach (CoreRow row in SelectedRows)
  433. {
  434. JobMaterial material = row.ToObject<JobMaterial>();
  435. PurchaseOrderItem POItem = new PurchaseOrderItem();
  436. POItem.Product.ID = material.Product.ID;
  437. POItem.Product.Code = material.Product.Code;
  438. POItem.Product.Name = material.Product.Name;
  439. POItem.Description = material.Product.Name;
  440. POItem.Qty = 0;
  441. POItem.Dimensions.CopyFrom(material.Dimensions);
  442. POItem.Style.ID = material.Style.ID;
  443. POItem.Style.Code = material.Style.Code;
  444. POItem.Style.Description = material.Style.Description;
  445. POItem.Job.ID = material.Job.ID;
  446. POItem.Dimensions.UnitSize = material.Dimensions.UnitSize;
  447. items.Add(POItem);
  448. }
  449. result.LoadRows(items);
  450. Progress.Close();
  451. return result;
  452. }
  453. #endregion
  454. }
  455. }