using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; namespace PRSDesktop { public class JobBillOfMaterialsItemGrid : DynamicDataGrid { Guid empID = Guid.Empty; string empName = ""; public JobBillOfMaterialsItemGrid() { Options.AddRange( DynamicGridOption.RecordCount, DynamicGridOption.SelectColumns, DynamicGridOption.AddRows, DynamicGridOption.ExportData, DynamicGridOption.FilterRows, DynamicGridOption.MultiSelect, DynamicGridOption.EditRows, DynamicGridOption.DeleteRows ); HiddenColumns.Add(x => x.Dimensions.Unit.ID); HiddenColumns.Add(x => x.Dimensions.Unit.Format); HiddenColumns.Add(x => x.Dimensions.Unit.Formula); HiddenColumns.Add(x => x.Dimensions.Unit.HasLength); HiddenColumns.Add(x => x.Dimensions.Unit.HasWidth); HiddenColumns.Add(x => x.Dimensions.Unit.HasWeight); HiddenColumns.Add(x => x.Dimensions.Unit.HasHeight); HiddenColumns.Add(x => x.Dimensions.Unit.HasQuantity); HiddenColumns.Add(x => x.Dimensions.Length); HiddenColumns.Add(x => x.Dimensions.Width); HiddenColumns.Add(x => x.Dimensions.Height); HiddenColumns.Add(x => x.Dimensions.Weight); HiddenColumns.Add(x => x.Dimensions.Quantity); HiddenColumns.Add(x => x.Dimensions.UnitSize); HiddenColumns.Add(x => x.Dimensions.Value); HiddenColumns.Add(x => x.Product.ID); HiddenColumns.Add(x => x.Product.Code); HiddenColumns.Add(x => x.Product.Name); HiddenColumns.Add(x => x.Style.ID); HiddenColumns.Add(x => x.Style.Code); HiddenColumns.Add(x => x.Style.Description); HiddenColumns.Add(x => x.BillOfMaterials.ID); HiddenColumns.Add(x => x.Job.ID); HiddenColumns.Add(x => x.PurchaseOrderItem.ID); HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber); HiddenColumns.Add(x => x.PurchaseOrderItem.ReceivedDate); HiddenColumns.Add(x => x.PurchaseOrderItem.PONumber); AddButton("Create Requi", null, CreateRequi); AddButton("Create PO", null, CreatePO); GetEmpID(); } private bool CreateRequi(System.Windows.Controls.Button btn, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select at least one row to add to Requi"); return false; } JobRequisition jobRequi = new JobRequisition(); jobRequi.Job.ID = JobID; jobRequi.Description = "New Requisition"; var page = new JobRequisitionGrid(); page.OnAfterSave += (form, items) => { MessageBox.Show("Success - Job Requisition Raised."); }; return page.EditItems(new[] { jobRequi }, LoadJobRequiItems, true); } private CoreTable LoadJobRequiItems(Type arg) { Progress.Show("Working"); var result = new CoreTable(); result.LoadColumns(typeof(JobRequisitionItem)); List requiItems = new List(); foreach (CoreRow row in SelectedRows) { JobBillOfMaterialsItem BOMitem = row.ToObject(); JobRequisitionItem requiItem = new JobRequisitionItem(); requiItem.Qty = BOMitem.Quantity; requiItem.Product.ID = BOMitem.Product.ID; requiItem.Product.Code = BOMitem.Product.Code; requiItem.Product.Name = BOMitem.Product.Name; requiItem.Style.ID = BOMitem.Style.ID; requiItem.Style.Code = BOMitem.Style.Code; requiItem.Style.Description = BOMitem.Style.Description; requiItem.Supplier.ID = BOMitem.Supplier.ID; requiItem.Supplier.Code = BOMitem.Supplier.Code; requiItem.Supplier.Name = BOMitem.Supplier.Name; requiItem.Dimensions.CopyFrom(BOMitem.Dimensions); requiItem.Job.ID = JobID; requiItems.Add(requiItem); } result.LoadRows(requiItems); Progress.Close(); return result; } public Guid JobID { get; set; } public Guid BillOfMaterialsID { get; set; } public event DataModelUpdateEvent OnUpdateDataModel; protected override void DoAdd(bool OpenEditorOnDirectEdit = false) { if (BillOfMaterialsID.Equals(Guid.Empty) || BillOfMaterialsID.Equals(CoreUtils.FullGuid)) MessageBox.Show("Please select a Bill Of Materials first!"); else base.DoAdd(); } protected override JobBillOfMaterialsItem CreateItem() { var result = base.CreateItem(); result.BillOfMaterials.ID = BillOfMaterialsID; result.Job.ID = JobID; return result; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder sort, Action action) { criteria.Add(new Filter(x => x.BillOfMaterials.ID).IsEqualTo(BillOfMaterialsID)); base.Reload(criteria, columns, ref sort, action); } #region Create PO private void GetEmpID() { CoreTable table = new Client().Query(new Filter(x => x.UserLink.UserID).IsEqualTo(ClientFactory.UserID), new Columns(x => x.ID, x => x.Name)); if (table.Rows.Any()) { empID = Guid.Parse(table.Rows.FirstOrDefault().Values[0].ToString()); empName = table.Rows.FirstOrDefault().Values[1].ToString(); } } private bool CreatePO(System.Windows.Controls.Button btn, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select at least one row to add to PO"); return false; } PurchaseOrder purchaseOrder = new PurchaseOrder(); purchaseOrder.Notes = "Created from Job BOM Review Screen" + System.Environment.NewLine; purchaseOrder.RaisedBy.ID = empID; var page = new SupplierPurchaseOrders(); page.OnAfterSave += (form, items) => { PurchaseOrderOnSave(form, items.Cast().ToArray()); MessageBox.Show("Success - New Purchase Order Created (" + purchaseOrder.PONumber + ")"); }; return page.EditItems(new[] { purchaseOrder }, LoadPurchaseOrderItems, true); } private void PurchaseOrderOnSave(IDynamicEditorForm form, PurchaseOrder[] items) { Progress.Show("Working"); Guid POID = items[0].ID; CoreTable table = new Client().Query(new Filter(x => x.PurchaseOrderLink.ID).IsEqualTo(POID), new Columns(x => x.ID, x => x.Product.ID, x => x.Qty, x => x.Dimensions.UnitSize, x => x.DueDate, x => x.Job.ID)); if (table.Rows.Any()) { var poItems = AddPOItems(table, new List()); var BOMItems = MatchBOMItems(poItems, new List()); if (BOMItems.Count > 0) SaveAndRefreshScreen(BOMItems); } Progress.Close(); } private void SaveAndRefreshScreen(List bomItems) { new Client().Save(bomItems, "Updated on Create Purchase Order from BOM Dashboard"); Dispatcher.BeginInvoke(() => { Refresh(false, true); }); } private List AddPOItems(CoreTable table, List poItems) { foreach (CoreRow row in table.Rows) { PurchaseOrderItem poItem = row.ToObject(); poItems.Add(poItem); } return poItems; } private List MatchBOMItems(List poItems, List bomItems) { foreach (CoreRow row in SelectedRows) { JobBillOfMaterialsItem bomItem = row.ToObject(); foreach (var item in poItems) { if (string.IsNullOrWhiteSpace(bomItem.Dimensions.UnitSize)) bomItem.Dimensions.UnitSize = QueryUnitSize(bomItem.Product.ID); if (string.IsNullOrWhiteSpace(item.Dimensions.UnitSize)) item.Dimensions.UnitSize = QueryUnitSize(item.Product.ID); if (bomItem.Job.ID == Guid.Empty) bomItem.Job.ID = QueryJobID(bomItem.BillOfMaterials.ID); if (item.Job.ID == Guid.Empty) item.Job.ID = QueryJobID(bomItem.BillOfMaterials.ID); if (MatchBOMItemToPOItem(bomItem, item)) bomItems.Add(UpdateBOMItemWithPODetails(bomItem, item)); } } return bomItems; } private JobBillOfMaterialsItem UpdateBOMItemWithPODetails(JobBillOfMaterialsItem bomItem, PurchaseOrderItem item) { bomItem.PurchaseOrderItem.ID = item.ID; bomItem.PurchaseOrderItem.DueDate = item.DueDate; return bomItem; } private string QueryUnitSize(Guid productID) { CoreTable table = new Client().Query(new Filter(x => x.ID).IsEqualTo(productID), new Columns(x => x.Dimensions.UnitSize)); return table.Rows.FirstOrDefault().Get("Dimensions.UnitSize"); } private Guid QueryJobID(Guid iD) { CoreTable table = new Client().Query(new Filter(x => x.ID).IsEqualTo(iD), new Columns(x => x.Job.ID)); return table.Rows.FirstOrDefault().Get(x => x.Job.ID); } private bool MatchBOMItemToPOItem(JobBillOfMaterialsItem bomItem, PurchaseOrderItem item) { if (bomItem.Product.ID == item.Product.ID && bomItem.Dimensions.UnitSize == item.Dimensions.UnitSize && bomItem.Job.ID == item.Job.ID) return true; else return false; } private CoreTable LoadPurchaseOrderItems(Type arg) { Progress.Show("Working"); var result = new CoreTable(); result.LoadColumns(typeof(PurchaseOrderItem)); List items = new List(); foreach (CoreRow row in SelectedRows) { JobBillOfMaterialsItem BOMItem = row.ToObject(); PurchaseOrderItem POItem = new PurchaseOrderItem(); POItem.Product.ID = BOMItem.Product.ID; POItem.Product.Code = BOMItem.Product.Code; POItem.Product.Name = BOMItem.Product.Name; POItem.Description = BOMItem.Product.Name; POItem.Qty = BOMItem.Quantity; POItem.Dimensions.CopyFrom(BOMItem.Dimensions); POItem.Style.ID = BOMItem.Style.ID; POItem.Style.Code = BOMItem.Style.Code; POItem.Style.Description = BOMItem.Style.Description; POItem.Job.ID = BOMItem.Job.ID; POItem.Dimensions.UnitSize = BOMItem.Dimensions.UnitSize; items.Add(POItem); } result.LoadRows(items); Progress.Close(); return result; } #endregion } }