using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using InABox.Clients; using InABox.Core; namespace Comal.Classes { public class JobActivityLookup : LookupGenerator { public JobActivityLookup(JobActivity[] items) : base(items) { AddColumn("Code", typeof(string)); AddColumn("Description", typeof(string)); AddColumn("Color", typeof(string)); } protected override void DoGenerateLookups() { Clear(); var acts = new Client().Query( new Filter(x=>x.IsLeave).IsEqualTo(false), Columns.None().Add(x => x.ID, x => x.Code, x => x.Description, x => x.Color), new SortOrder(x => x.Code) ); foreach (var row in acts.Rows) AddValue( row.Get(col => col.ID), string.Format("{0}: {1}", row.Get(col => col.Code), row.Get(col => col.Description)), row.Get(col => col.Code), row.Get(col => col.Description), row.Get(col => col.Color) ); } } public class JobActivityActualAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Actual.Duration; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { Assignment => Assignment.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID }, { Assignment => Assignment.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID } }; public override AggregateCalculation Calculation => AggregateCalculation.Sum; } public class JobActivityBookedAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Booked.Duration; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { Assignment => Assignment.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID }, { Assignment => Assignment.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID } }; public override AggregateCalculation Calculation => AggregateCalculation.Sum; } public class JobActivityBudgetAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Budget; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobActivity => JobActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID }, { JobActivity => JobActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID } }; public override AggregateCalculation Calculation => AggregateCalculation.Sum; } public class JobActivityQuoteAggregate : CoreAggregate { public override Expression> Aggregate => x => x.Quote; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { JobActivity => JobActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID }, { JobActivity => JobActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID } }; public override AggregateCalculation Calculation => AggregateCalculation.Sum; } public interface IJobActivity { JobLink JobLink { get; set; } AssignmentActivityLink ActivityLink { get; set; } } public class JobActivityAssignmentUnionGenerator : AutoEntityUnionGenerator { protected override void Configure() { AddTable(); AddTable(); } public override bool Distinct => true; public override Column[] IDColumns => new Column[] { new Column(x => x.JobLink.ID), new Column(x => x.ActivityLink.ID) }; } [AutoEntity(typeof(JobActivityAssignmentUnionGenerator))] public class JobActivitySummary : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany, ILicense { [NullEditor] public JobLink JobLink { get; set; } [EditorSequence(1)] [Caption("Activity",IncludePath = false)] public AssignmentActivityLink ActivityLink { get; set; } [EditorSequence(2)] [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)] [Aggregate(typeof(JobActivityQuoteAggregate))] public TimeSpan Quote { get; set; } [EditorSequence(3)] [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)] [Aggregate(typeof(JobActivityBudgetAggregate))] public TimeSpan Budget { get; set; } [EditorSequence(4)] [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)] [Aggregate(typeof(JobActivityBookedAggregate))] public TimeSpan Booked { get; set; } [EditorSequence(5)] [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)] [Aggregate(typeof(JobActivityActualAggregate))] public TimeSpan Actual { get; set; } } public class JobActivity : Entity, IRemotable, IPersistent, IManyToMany, ILicense, IJobActivity { [EditorSequence(1)] [EntityRelationship(DeleteAction.Cascade)] public JobLink JobLink { get; set; } [EditorSequence(2)] [EntityRelationship(DeleteAction.SetNull)] public AssignmentActivityLink ActivityLink { get; set; } [EditorSequence(3)] [DurationEditor(Summary = Summary.Sum)] public TimeSpan Quote { get; set; } [EditorSequence(4)] [DurationEditor(Summary = Summary.Sum)] public TimeSpan Budget { get; set; } } }