| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | 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<JobActivity>    {        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<Activity>().Query(                new Filter<Activity>(x=>x.IsLeave).IsEqualTo(false),                new Columns<Activity>(x => x.ID, x => x.Code, x => x.Description, x => x.Color),                new SortOrder<Activity>(x => x.Code)            );            foreach (var row in acts.Rows)                AddValue(                    row.Get<Activity, Guid>(col => col.ID),                    string.Format("{0}: {1}", row.Get<Activity, string>(col => col.Code),                        row.Get<Activity, string>(col => col.Description)),                    row.Get<Activity, string>(col => col.Code),                    row.Get<Activity, string>(col => col.Description),                    row.Get<Activity, string>(col => col.Color)                );        }    }    public class JobActivityActualAggregate : CoreAggregate<JobActivitySummary, Assignment, TimeSpan>    {        public override Expression<Func<Assignment, TimeSpan>> Aggregate => x => x.Actual.Duration;        public override Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>> Links =>            new Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>>()            {                { 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<JobActivitySummary, Assignment, TimeSpan>    {        public override Expression<Func<Assignment, TimeSpan>> Aggregate => x => x.Booked.Duration;        public override Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>> Links =>            new Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>>()            {                { 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<JobActivitySummary, JobActivity, TimeSpan>    {        public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Duration;        public override Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>            new Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>>()            {                { 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<IJobActivity>    {        protected override void Configure()        {            AddTable<JobActivity>();            AddTable<Assignment>();        }        public override bool Distinct => true;        public override Column<IJobActivity>[] IDColumns => new Column<IJobActivity>[]        {            new Column<IJobActivity>(x => x.JobLink.ID),            new Column<IJobActivity>(x => x.ActivityLink.ID)        };    }    [AutoEntity(typeof(JobActivityAssignmentUnionGenerator))]    public class JobActivitySummary : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany<Job>, ILicense<ProjectManagementLicense>    {        [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(JobActivityBudgetAggregate))]        public TimeSpan Budget { get; set; }                [EditorSequence(3)]        [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]        [Aggregate(typeof(JobActivityBookedAggregate))]        public TimeSpan Booked { get; set; }                        [EditorSequence(3)]        [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]        [Aggregate(typeof(JobActivityActualAggregate))]        public TimeSpan Actual { get; set; }    }            public class JobActivity : Entity, IRemotable, IPersistent, IManyToMany<Job, Activity>, ILicense<ProjectManagementLicense>, 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 Duration { get; set; }    }    }
 |