using System; using System.Collections.Generic; using System.Linq; using Comal.Classes; using InABox.Clients; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; namespace PRSDesktop; public class JobGridSettings : IUserConfigurationSettings { [Obsolete] private CoreFilterDefinition? _currentFilter; [Obsolete] public CoreFilterDefinition? CurrentFilter { get => _currentFilter; set { if (value is not null) { Filters = new DynamicGridSelectedFilterSettings(new List { value }, false, null); } } } public DynamicGridSelectedFilterSettings Filters { get; set; } = new(); } public class ProjectsGrid : DynamicDataGrid { private Guid _statusid = Guid.Empty; private JobGridSettings _settings; public ProjectsGrid() { _settings = new UserConfiguration().Load(); FilterComponent.SetSettings(_settings.Filters, false); FilterComponent.OnFiltersSelected += FilterComponent_OnFilterSelected; HiddenColumns.Add(x => x.ID); HiddenColumns.Add(x => x.JobNumber); HiddenColumns.Add(x => x.Name); HiddenColumns.Add(x => x.Customer.ID); HiddenColumns.Add(x => x.Customer.Code); HiddenColumns.Add(x => x.Customer.Name); HiddenColumns.Add(x => x.SiteAddress.Street); HiddenColumns.Add(x => x.SiteAddress.City); HiddenColumns.Add(x => x.SiteAddress.State); HiddenColumns.Add(x => x.SiteAddress.PostCode); HiddenColumns.Add(x => x.Account.ID); HiddenColumns.Add(x => x.Account.Code); HiddenColumns.Add(x => x.Account.Name); HiddenColumns.Add(x => x.Notes); HiddenColumns.Add(x => x.JobStatus.ID); HiddenColumns.Add(x => x.JobStatus.Active); HiddenColumns.Add(x => x.DefaultScope.ID); ActionColumns.Add(new DynamicMapColumn(this, x => x.SiteAddress.Location)); ActionColumns.Add(new DynamicMenuColumn(BuildMenu)); } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.AddRange( DynamicGridOption.RecordCount, DynamicGridOption.SelectColumns, DynamicGridOption.FilterRows ); } private void BuildMenu(DynamicMenuColumn column, CoreRow? row) { if (Security.IsAllowed()) { column.AddItem("Cancel all active requisitions", null, CancelJobRequisitions_Click); } if (Security.IsAllowed()) { column.AddItem("Release Job Reserves", null, ReleaseJobReserves_Click); } } private void CancelJobRequisitions_Click(CoreRow? obj) { var job = obj?.ToObject(); if (job is null) { MessageWindow.ShowMessage("Please select a job.", "No job selected"); return; } if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will cancel all requisitions for this job.", "Confirm") != MessageWindowResult.Yes) { MessageWindow.ShowMessage("No action taken.", "Process aborted"); return; } var requisitionItems = Client.Query( new Filter(x => x.Requisition.Job.ID).IsEqualTo(job.ID) .And(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Cancelled) .And(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Issued) .And(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Archived), new Columns(x => x.ID) .Add(x => x.Cancelled)) .ToList(); foreach(var jri in requisitionItems) { jri.Cancelled = DateTime.Now; } Client.Save(requisitionItems, "Cancelled all job requisitions for job"); } private void ReleaseJobReserves_Click(CoreRow? obj) { var job = obj?.ToObject(); if (job is null) { MessageWindow.ShowMessage("Please select a job.", "No job selected"); return; } if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will release all reserves for this job.", "Confirm") != MessageWindowResult.Yes) { MessageWindow.ShowMessage("No action taken.", "Process aborted"); return; } var movements = Client.Query( new Filter(x => x.Job.ID).IsEqualTo(job.ID), new Columns(x => x.Units) .Add(x => x.Location.ID) .Add(x => x.Product.ID) .Add(x => x.Style.ID) .AddDimensionsColumns(x => x.Dimensions) .Add(x => x.Cost) .Add(x => x.OrderItem.ID) .Add(x => x.JobRequisitionItem.ID)) .ToObjects() .GroupBy(x => new { Location = x.Location.ID, Product = x.Product.ID, Style = x.Style.ID, x.Dimensions, x.Cost, OrderItem = x.OrderItem.ID, JobRequisitionItem = x.JobRequisitionItem.ID }) .Select(x => new { x.Key, Units = x.Sum(x => x.Units) }); var toSave = new List(); foreach(var group in movements) { var from = new StockMovement(); from.Location.ID = group.Key.Location; from.Style.ID = group.Key.Style; from.Product.ID = group.Key.Product; from.Dimensions.CopyFrom(group.Key.Dimensions); var to = from.CreateMovement(); from.Job.ID = job.ID; from.Cost = group.Key.Cost; to.Cost = group.Key.Cost; from.OrderItem.ID = group.Key.OrderItem; to.OrderItem.ID = group.Key.OrderItem; from.JobRequisitionItem.ID = group.Key.JobRequisitionItem; to.JobRequisitionItem.ID = group.Key.JobRequisitionItem; from.Type = StockMovementType.TransferOut; to.Type = StockMovementType.TransferIn; to.Transaction = from.Transaction; from.Units = -group.Units; to.Units = group.Units; toSave.Add(from); toSave.Add(to); } Client.Save(toSave, "Released all job stock."); } public Guid StatusID { get => _statusid; set { _statusid = value; } } protected override void Reload(Filters criteria, Columns columns, ref SortOrder? sort, Action action) { if (_statusid != Guid.Empty) criteria.Add(new Filter(x => x.JobStatus.ID).IsEqualTo(_statusid)); criteria.Add(new Filter(x => x.JobType).IsEqualTo(JobType.Project)); sort = new SortOrder(x => x.JobNumber, SortDirection.Descending); base.Reload(criteria, columns, ref sort, action); } public override DynamicEditorPages LoadEditorPages(Job item) { var pages = new DynamicEditorPages(new IDynamicEditorPage[] { new DynamicManyToManyGrid(), //new DynamicManyToManyGrid(), new DynamicOneToManyGrid(), new JobFormDefinitionGrid(), //new DynamicOneToManyGrid(), }); return pages; } protected override Job CreateItem() { var result = base.CreateItem(); var defstatus = new Client().Query(new Filter(x => x.Default).IsEqualTo(true)); if (defstatus.Rows.Any()) result.JobStatus.ID = defstatus.Rows.First().Get(x => x.ID); result.JobType = JobType.Project; return result; } protected override void CustomiseEditor(Job[] items, DynamicGridColumn column, BaseEditor editor) { base.CustomiseEditor(items, column, editor); if(new Column(x => x.Customer.ID).IsEqualTo(column.ColumnName) && editor is CodePopupEditor popup) { popup.CanAdd = Security.CanEdit(); } } protected override Dictionary EditorValueChanged(IDynamicEditorForm editor, Job[] items, string name, object value) { var result = base.EditorValueChanged(editor, items, name, value); if (name.Equals("Customer.ID")) { // false here because a customer has a defaultcontact // and we need to load the lookups before we set the default value var contact = editor.FindEditor("Contact.ID") as ILookupEditorControl; if (contact != null) DefineLookups(contact,items,false); } return result; } private void FilterComponent_OnFilterSelected(DynamicGridSelectedFilterSettings settings) { _settings.Filters = settings; new UserConfiguration().Save(_settings); } }