using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; using InABox.WPF; namespace PRSDesktop { internal class SupplierPurchaseOrderItems : DynamicDataGrid { private Button bill; private Button? consign; private Button receive; private Button? viewconsign; private Button assignLocation; public Guid OrderID { get; set; } public Guid SupplierID { get; set; } public bool Closed { get; set; } public SupplierPurchaseOrderItems() { Options.AddRange(DynamicGridOption.RecordCount, DynamicGridOption.SelectColumns, DynamicGridOption.MultiSelect, DynamicGridOption.FilterRows); HiddenColumns.Add(x => x.PurchaseOrderLink.SupplierLink.ID); HiddenColumns.Add(x => x.PurchaseOrderLink.Category.ID); HiddenColumns.Add(x => x.ID); HiddenColumns.Add(x => x.Product.ID); HiddenColumns.Add(x => x.Product.Code); HiddenColumns.Add(x => x.Product.Name); HiddenColumns.Add(x => x.Description); HiddenColumns.Add(x => x.TaxCode.ID); HiddenColumns.Add(x => x.TaxCode.Code); HiddenColumns.Add(x => x.TaxCode.Description); HiddenColumns.Add(x => x.TaxCode.Rate); HiddenColumns.Add(x => x.TaxRate); HiddenColumns.Add(x => x.ExTax); HiddenColumns.Add(x => x.Tax); HiddenColumns.Add(x => x.IncTax); HiddenColumns.Add(x => x.BillLine.ID); HiddenColumns.Add(x => x.BillLine.Deleted); HiddenColumns.Add(x => x.Consignment.ID); HiddenColumns.Add(x => x.Product.DigitalForm.ID); HiddenColumns.Add(x => x.Product.DigitalForm.Description); HiddenColumns.Add(x => x.Product.Image.ID); HiddenColumns.Add(x => x.Product.Image.FileName); ActionColumns.Add(new DynamicImageManagerColumn(this, x => x.Product.Image, true) { Position = DynamicActionColumnPosition.Start }); HiddenColumns.Add(x => x.FormCount); HiddenColumns.Add(x => x.OpenForms); ActionColumns.Add(new DynamicMenuColumn(BuildMenu) { Position = DynamicActionColumnPosition.Start }); ActionColumns.Add(new DynamicImageColumn(FormsImage) { Position = DynamicActionColumnPosition.Start, ToolTip = FormsToolTip }); if (Security.IsAllowed()) { consign = AddButton("Create Consignment", null, CreateConsignment); consign.IsEnabled = false; viewconsign = AddButton("View Consignment", null, ViewConsignment); viewconsign.Visibility = Visibility.Collapsed; } receive = AddButton("Receive Items", null, ReceiveItems); receive.IsEnabled = false; bill = AddButton("Enter Bill", null, EnterBill); bill.IsEnabled = false; assignLocation = AddButton("Assign Location", null, AssignLocation); } public static bool AssignLocation(Button btn, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select at least one row to assign"); return false; } if (MessageBox.Show("Create new location?", "Confirm", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { var grid = new StockLocationGrid(); var location = new StockLocation(); if (grid.EditItems(new StockLocation[] { location })) AssignLocationToItems(location.ID, rows); } else { var popup = new PopupList(typeof(StockLocation), Guid.Empty, new string[] { }); if (popup.ShowDialog() == true) AssignLocationToItems(popup.ID, rows); } return true; } private static void AssignLocationToItems(Guid locationID, CoreRow[] rows) { List items = new List(); foreach (CoreRow row in rows) { var item = row.ToObject(); item.StockLocation.ID = locationID; items.Add(item); } new Client().Save(items, "Added stock location from PurchaseOrderItem Grid"); } private StockLocation[] QueryLocations() { CoreTable table = new Client().Query(new Filter(x => x.Active).IsEqualTo(true), new Columns(x => x.ID)); List locations = new List(); foreach (CoreRow row in table.Rows) locations.Add(row.ToObject()); return locations.ToArray(); } private void BuildMenu(DynamicMenuColumn column, CoreRow? row) { if (row == null) return; var formsItem = column.AddItem("Digital Forms", PRSDesktop.Resources.kanban, null); DynamicGridUtils.PopulateFormMenu(formsItem, row.Get(x => x.ID), () => row.ToObject()); } private FrameworkElement? FormsToolTip(DynamicActionColumn arg1, CoreRow? arg2) { var text = arg2 == null || arg2.Get(x => x.Product.DigitalForm.ID) == Guid.Empty ? "" : arg2.Get(c => c.FormCount) == 0 ? "No forms found for this item" : arg2.Get(c => c.OpenForms) > 0 ? "Incomplete forms found" : "All forms completed"; return string.IsNullOrWhiteSpace(text) ? null : arg1.TextToolTip(text); } private BitmapImage? FormsImage(CoreRow? arg) { if (arg == null) return PRSDesktop.Resources.quality.AsBitmapImage(); return arg.Get(x => x.Product.DigitalForm.ID) == Guid.Empty ? null : arg.Get(c => c.FormCount) == 0 ? PRSDesktop.Resources.warning.AsBitmapImage() : arg.Get(c => c.OpenForms) > 0 ? PRSDesktop.Resources.warning.AsBitmapImage() : PRSDesktop.Resources.quality.AsBitmapImage(); } //private bool ViewQAForm(Button arg1, CoreRow[] arg2) //{ // var item = DynamicFormWindow.LoadDigitalForm(arg2[0].Get(x => x.ID)); // if (item.Form.ID == Guid.Empty) // { // item.Form.ID = arg2[0].Get(x => x.ProductLink.DigitalForm.ID); // item.Form.Description = arg2[0].Get(x => x.ProductLink.DigitalForm.Description); // } // var result = DynamicFormWindow.EditDigitalForm(item); // if (result) // SaveItem(item); // return result; //} //private void ViewQAForm2(object sender, object item) //{ //} //public override void LoadEditorButtons(PurchaseOrderItem item, DynamicEditorButtons buttons) //{ // base.LoadEditorButtons(item, buttons); // buttons.Add(new DynamicEditorButton("QA Form", null, item, ViewQAForm2)); //} protected override void SelectItems(CoreRow[]? rows) { if (consign != null && viewconsign != null) { consign.IsEnabled = rows != null && !rows.Any(r => Entity.IsEntityLinkValid(x => x.Consignment, r)) && !rows.Any(r => r.Get(c => c.ReceivedDate).IsEmpty() == false); viewconsign.Visibility = rows == null || consign.IsEnabled || rows.Select(r => r.Get(x => x.Consignment.ID)).Distinct().Count() != 1 ? Visibility.Collapsed : Visibility.Visible; consign.Visibility = viewconsign.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; } receive.IsEnabled = rows != null && !rows.Any(r => Entity.IsEntityLinkValid(x => x.Consignment, r)) && !rows.Any(r => r.Get(c => c.ReceivedDate).IsEmpty() == false); bill.IsEnabled = rows != null && !rows.Any(r => r.IsEntityLinkValid(x => x.BillLine)); base.SelectItems(rows); } protected override void Reload(Filters criteria, Columns columns, ref SortOrder? sort, Action action) { criteria.Add(new Filter(x => x.PurchaseOrderLink.ID).IsEqualTo(OrderID)); base.Reload(criteria, columns, ref sort, action); } protected override PurchaseOrderItem CreateItem() { var result = base.CreateItem(); result.PurchaseOrderLink.ID = OrderID; return result; } public override bool EditItems(PurchaseOrderItem[] items, Func? PageDataHandler, bool PreloadPages = false) { if (OrderID.Equals(Guid.Empty)) { MessageBox.Show("Please select a Purchase Order first!"); return false; } if (Closed) { MessageBox.Show("Cannot Modify a Closed Purchase Order"); return false; } return base.EditItems(items, PageDataHandler, true); } protected override Dictionary EditorValueChanged(IDynamicEditorForm editor, PurchaseOrderItem[] items, string name, object value) { var results = base.EditorValueChanged(editor, items, name, value); if (name.Equals("ProductLink.TaxCode.ID")) DynamicGridUtils.UpdateEditorValue(items, "TaxCode.ID", (Guid)value, results); return results; } protected override void OnAfterEditorValueChanged(DynamicEditorGrid grid, PurchaseOrderItem[] items, String name, Dictionary changes) { base.OnAfterEditorValueChanged(grid, items, name, changes); if (name.Equals("Product.ID") || name.Equals("Job.ID") || name.StartsWith("Dimensions.")) { PurchaseOrder.UpdateCosts( items, SupplierID, changes ); } } private bool CheckPOStatus(Func basefunction) { if (OrderID.Equals(Guid.Empty) || (OrderID.Equals(CoreUtils.FullGuid))) { MessageBox.Show("Please select a Purchase Order first!"); return false; } if (Closed) { MessageBox.Show("Cannot Modify a Closed Purchase Order"); return false; } return basefunction(); } protected override bool CanCreateItems() => CheckPOStatus(() => base.CanCreateItems()); protected override bool CanDeleteItems(CoreRow[] rows) => CheckPOStatus(() => base.CanDeleteItems(rows)); private bool CreateConsignment(Button sender, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select a row first"); return false; } var consign = new Consignment(); consign.Supplier.ID = rows.First().Get(x => x.PurchaseOrderLink.SupplierLink.ID); consign.Category.ID = rows.First().Get(x => x.PurchaseOrderLink.Category.ID); return new DynamicDataGrid().EditItems(new[] { consign }, LoadConsignmentLines, true); } private bool ViewConsignment(Button sender, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select a row first"); return false; } var consign = new Consignment(); consign.Supplier.ID = rows.First().Get(x => x.PurchaseOrderLink.SupplierLink.ID); consign.Category.ID = rows.First().Get(x => x.PurchaseOrderLink.Category.ID); return new DynamicDataGrid().EditItems(new[] { consign }, LoadConsignmentLines, true); } private CoreTable LoadConsignmentLines(Type arg) { var result = new CoreTable(); result.LoadColumns(typeof(PurchaseOrderItem)); result.LoadRows(SelectedRows); return result; } private bool ReceiveItems(Button sender, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select a row first"); return false; } var now = DateTime.Now; using (new WaitCursor()) { var items = LoadItems(rows); foreach (var item in items) item.ReceivedDate = now; new Client().Save(items, "Consignment Items Received"); } return true; } public static bool EnterBill(Button sender, CoreRow[] rows) { if (!rows.Any()) { MessageBox.Show("Please select a row first"); return false; } var bill = new Bill(); bill.SupplierLink.ID = rows.First().Get(x => x.PurchaseOrderLink.SupplierLink.ID); bill.BillDate = DateTime.Today; return new DynamicDataGrid().EditItems(new[] { bill }, (type) => { return LoadBillLines(type, rows); }, true); } public static CoreTable LoadBillLines(Type type, CoreRow[] rows) { var result = new CoreTable(); result.LoadColumns(typeof(BillLine)); foreach (var row in rows) { var billrow = result.NewRow(); billrow.Set(x => x.OrderItem.ID, row.Get(x => x.ID)); var description = new List(); if (row.Get(x => x.Product.ID) != Guid.Empty) description.Add(string.Format("{0} : {1}", row.Get(x => x.Product.Code), row.Get(x => x.Product.Name))); var Description = row.Get(x => x.Description); if (!string.IsNullOrEmpty(Description)) description.Add(Description); billrow.Set(x => x.Description, string.Join("\n", description)); billrow.Set(x => x.TaxCode.ID, row.Get(x => x.TaxCode.ID)); billrow.Set(x => x.TaxCode.Code, row.Get(x => x.TaxCode.Code)); billrow.Set(x => x.TaxCode.Description, row.Get(x => x.TaxCode.Description)); billrow.Set(x => x.TaxCode.Rate, row.Get(x => x.TaxCode.Rate)); billrow.Set(x => x.TaxRate, row.Get(x => x.TaxRate)); billrow.Set(x => x.ExTax, row.Get(x => x.ExTax)); billrow.Set(x => x.Tax, row.Get(x => x.Tax)); billrow.Set(x => x.IncTax, row.Get(x => x.IncTax)); result.Rows.Add(billrow); } return result; } public bool bRemoveButtons { get; set; } public void RemoveButtons() { bill = null; receive = null; consign = null; viewconsign = null; assignLocation = null; } } }