using System; using System.Collections.Generic; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { public class JobDocumentSetMileStoneKanbanCount : CoreAggregate { public override Expression> Aggregate => x => x.ID; public override AggregateCalculation Calculation => AggregateCalculation.Count; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobDocumentSetMileStoneFile => JobDocumentSetMileStoneFile.Entity.ID, JobDocumentSetMileStone => JobDocumentSetMileStone.ID } }; public override Filter? Filter => new Filter(x => x.Kanban.Completed).IsEqualTo(DateTime.MinValue); } public class JobDocumentSetMileStoneFileCount : CoreAggregate { public override Expression> Aggregate => x => x.ID; public override AggregateCalculation Calculation => AggregateCalculation.Count; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobDocumentSetMileStoneFile => JobDocumentSetMileStoneFile.EntityLink.ID, JobDocumentSetMileStone => JobDocumentSetMileStone.ID } }; } [Caption("Milestones")] public class JobDocumentSetMileStone : Entity, IRemotable, IPersistent, IOneToMany, IJobDocumentSetMileStone, ILicense { [EntityRelationship(DeleteAction.Cascade)] [Editable(Editable.Disabled)] [EditorSequence(0)] public JobDocumentSetLink DocumentSet { get; set; } [EntityRelationship(DeleteAction.Cascade)] [Editable(Editable.Disabled)] [EditorSequence(1)] public JobDocumentSetMileStoneTypelink Type { get; set; } [CodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)] [EditorSequence(2)] public string Revision { get; set; } [EditorSequence(3)] public EmployeeLink Employee { get; set; } [EnumLookupEditor(typeof(JobDocumentSetMileStoneStatus))] [EditorSequence(4)] public JobDocumentSetMileStoneStatus Status { get; set; } = JobDocumentSetMileStoneStatus.NotStarted; [NotesEditor] [EditorSequence(5)] public String[] Notes { get; set; } [TextBoxEditor] [EditorSequence(6)] public String Watermark { get; set; } [DateTimeEditor(Editable = Editable.Enabled)] [EditorSequence(7)] public DateTime Due { get; set; } [Obsolete("Replaced with Submitted", true)] public DateTime Issued { get; set; } [DateTimeEditor(Editable = Editable.Disabled)] [EditorSequence(8)] public DateTime Submitted { get; set; } [DateTimeEditor(Editable = Editable.Enabled)] [EditorSequence(9)] public DateTime Expected { get; set; } [DateTimeEditor(Editable = Editable.Disabled)] [EditorSequence(10)] public DateTime Closed { get; set; } [NullEditor] [Aggregate(typeof(JobDocumentSetMileStoneFileCount))] public int Attachments { get; set; } [NullEditor] [Aggregate(typeof(JobDocumentSetMileStoneKanbanCount))] public int Kanbans { get; set; } [NullEditor] public DateTime DataEntered { get; set; } protected override void DoPropertyChanged(string name, object? before, object? after) { base.DoPropertyChanged(name, before, after); if (String.Equals(name, "Status")) { JobDocumentSetMileStoneStatus status = (JobDocumentSetMileStoneStatus)(after ?? default(JobDocumentSetMileStoneStatus)); switch (status) { case JobDocumentSetMileStoneStatus.InProgress: case JobDocumentSetMileStoneStatus.OnHold: case JobDocumentSetMileStoneStatus.InfoRequired: Submitted = DateTime.MinValue; Closed = DateTime.MinValue; break; case JobDocumentSetMileStoneStatus.Submitted: Submitted = Submitted.IsEmpty() ? DateTime.Now : Submitted; Closed = DateTime.MinValue; break; case JobDocumentSetMileStoneStatus.Approved: case JobDocumentSetMileStoneStatus.Rejected: case JobDocumentSetMileStoneStatus.Cancelled: Submitted = Submitted.IsEmpty() ? DateTime.Now : Submitted; Closed = Closed.IsEmpty() ? DateTime.Now : Closed; break; } } } } }