| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 | 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),                Columns.None<Activity>().Add(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 JobActivityBOMAggregate : CoreAggregate<JobActivitySummary, JobBillOfMaterialsActivity, TimeSpan>    {        public override Expression<Func<JobBillOfMaterialsActivity, TimeSpan>> Aggregate => x => x.Duration;        public override Dictionary<Expression<Func<JobBillOfMaterialsActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>            new Dictionary<Expression<Func<JobBillOfMaterialsActivity, object>>, Expression<Func<JobActivitySummary, object>>>()            {                { JobBillofMaterialsActivity => JobBillofMaterialsActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },                { JobBillofMaterialsActivity => JobBillofMaterialsActivity.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.Budget;        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 class JobActivityRequiredFormula : IFormula<JobActivitySummary, TimeSpan>    {        public Expression<Func<JobActivitySummary, TimeSpan>> Value => x => x.BOM;        public Expression<Func<JobActivitySummary, TimeSpan>>[] Modifiers => new Expression<Func<JobActivitySummary, TimeSpan>>[] { x => x.Budget };        public FormulaOperator Operator => FormulaOperator.Add;        public FormulaType Type => FormulaType.Virtual;    }        public class JobActivityQuoteAggregate : CoreAggregate<JobActivitySummary, JobActivity, TimeSpan>    {        public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Quote;        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<JobBillOfMaterialsActivity>(new Filter<JobBillOfMaterialsActivity>(x=>x.BillOfMaterials.Approved).IsNotEqualTo(DateTime.MinValue));            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(JobActivityQuoteAggregate))]        public TimeSpan Quote { get; set; }                [EditorSequence(3)]        [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]        [Aggregate(typeof(JobActivityBOMAggregate))]        public TimeSpan BOM { get; set; }                [EditorSequence(4)]        [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]        [Aggregate(typeof(JobActivityBudgetAggregate))]        public TimeSpan Budget { get; set; }                [EditorSequence(5)]        [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]        [Formula(typeof(JobActivityRequiredFormula))]        public TimeSpan Required { get; set; }                [EditorSequence(5)]        [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]        [Aggregate(typeof(JobActivityBookedAggregate))]        public TimeSpan Booked { get; set; }                        [EditorSequence(6)]        [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 Quote { get; set; }                [EditorSequence(4)]        [DurationEditor(Summary = Summary.Sum)]        public TimeSpan Budget { get; set; }    }    }
 |