JobActivity.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using InABox.Clients;
  6. using InABox.Core;
  7. namespace Comal.Classes
  8. {
  9. public class JobActivityLookup : LookupGenerator<JobActivity>
  10. {
  11. public JobActivityLookup(JobActivity[] items) : base(items)
  12. {
  13. AddColumn("Code", typeof(string));
  14. AddColumn("Description", typeof(string));
  15. AddColumn("Color", typeof(string));
  16. }
  17. protected override void DoGenerateLookups()
  18. {
  19. Clear();
  20. var acts = new Client<Activity>().Query(
  21. new Filter<Activity>(x=>x.IsLeave).IsEqualTo(false),
  22. Columns.None<Activity>().Add(x => x.ID, x => x.Code, x => x.Description, x => x.Color),
  23. new SortOrder<Activity>(x => x.Code)
  24. );
  25. foreach (var row in acts.Rows)
  26. AddValue(
  27. row.Get<Activity, Guid>(col => col.ID),
  28. string.Format("{0}: {1}", row.Get<Activity, string>(col => col.Code),
  29. row.Get<Activity, string>(col => col.Description)),
  30. row.Get<Activity, string>(col => col.Code),
  31. row.Get<Activity, string>(col => col.Description),
  32. row.Get<Activity, string>(col => col.Color)
  33. );
  34. }
  35. }
  36. public class JobActivityActualAggregate : CoreAggregate<JobActivitySummary, Assignment, TimeSpan>
  37. {
  38. public override Expression<Func<Assignment, TimeSpan>> Aggregate => x => x.Actual.Duration;
  39. public override Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  40. new Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>>()
  41. {
  42. { Assignment => Assignment.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  43. { Assignment => Assignment.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  44. };
  45. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  46. }
  47. public class JobActivityBookedAggregate : CoreAggregate<JobActivitySummary, Assignment, TimeSpan>
  48. {
  49. public override Expression<Func<Assignment, TimeSpan>> Aggregate => x => x.Booked.Duration;
  50. public override Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  51. new Dictionary<Expression<Func<Assignment, object>>, Expression<Func<JobActivitySummary, object>>>()
  52. {
  53. { Assignment => Assignment.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  54. { Assignment => Assignment.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  55. };
  56. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  57. }
  58. public class JobActivityBOMAggregate : CoreAggregate<JobActivitySummary, JobBillOfMaterialsActivity, TimeSpan>
  59. {
  60. public override Expression<Func<JobBillOfMaterialsActivity, TimeSpan>> Aggregate => x => x.Duration;
  61. public override Dictionary<Expression<Func<JobBillOfMaterialsActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  62. new Dictionary<Expression<Func<JobBillOfMaterialsActivity, object>>, Expression<Func<JobActivitySummary, object>>>()
  63. {
  64. { JobBillofMaterialsActivity => JobBillofMaterialsActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  65. { JobBillofMaterialsActivity => JobBillofMaterialsActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  66. };
  67. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  68. }
  69. public class JobActivityBudgetAggregate : CoreAggregate<JobActivitySummary, JobActivity, TimeSpan>
  70. {
  71. public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Budget;
  72. public override Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  73. new Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>>()
  74. {
  75. { JobActivity => JobActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  76. { JobActivity => JobActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  77. };
  78. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  79. }
  80. public class JobActivityRequiredFormula : IFormula<JobActivitySummary, TimeSpan>
  81. {
  82. public Expression<Func<JobActivitySummary, TimeSpan>> Value => x => x.BOM;
  83. public Expression<Func<JobActivitySummary, TimeSpan>>[] Modifiers => new Expression<Func<JobActivitySummary, TimeSpan>>[] { x => x.Budget };
  84. public FormulaOperator Operator => FormulaOperator.Add;
  85. public FormulaType Type => FormulaType.Virtual;
  86. }
  87. public class JobActivityQuoteAggregate : CoreAggregate<JobActivitySummary, JobActivity, TimeSpan>
  88. {
  89. public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Quote;
  90. public override Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  91. new Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>>()
  92. {
  93. { JobActivity => JobActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  94. { JobActivity => JobActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  95. };
  96. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  97. }
  98. public interface IJobActivity
  99. {
  100. JobLink JobLink { get; set; }
  101. AssignmentActivityLink ActivityLink { get; set; }
  102. }
  103. public class JobActivityAssignmentUnionGenerator : AutoEntityUnionGenerator<IJobActivity>
  104. {
  105. protected override void Configure()
  106. {
  107. AddTable<JobBillOfMaterialsActivity>(new Filter<JobBillOfMaterialsActivity>(x=>x.BillOfMaterials.Approved).IsNotEqualTo(DateTime.MinValue));
  108. AddTable<JobActivity>();
  109. AddTable<Assignment>();
  110. }
  111. public override bool Distinct => true;
  112. public override Column<IJobActivity>[] IDColumns => new Column<IJobActivity>[]
  113. {
  114. new Column<IJobActivity>(x => x.JobLink.ID),
  115. new Column<IJobActivity>(x => x.ActivityLink.ID)
  116. };
  117. }
  118. [AutoEntity(typeof(JobActivityAssignmentUnionGenerator))]
  119. public class JobActivitySummary : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany<Job>, ILicense<ProjectManagementLicense>
  120. {
  121. [NullEditor]
  122. public JobLink JobLink { get; set; }
  123. [EditorSequence(1)]
  124. [Caption("Activity",IncludePath = false)]
  125. public AssignmentActivityLink ActivityLink { get; set; }
  126. [EditorSequence(2)]
  127. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  128. [Aggregate(typeof(JobActivityQuoteAggregate))]
  129. public TimeSpan Quote { get; set; }
  130. [EditorSequence(3)]
  131. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  132. [Aggregate(typeof(JobActivityBOMAggregate))]
  133. public TimeSpan BOM { get; set; }
  134. [EditorSequence(4)]
  135. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  136. [Aggregate(typeof(JobActivityBudgetAggregate))]
  137. public TimeSpan Budget { get; set; }
  138. [EditorSequence(5)]
  139. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  140. [Formula(typeof(JobActivityRequiredFormula))]
  141. public TimeSpan Required { get; set; }
  142. [EditorSequence(5)]
  143. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  144. [Aggregate(typeof(JobActivityBookedAggregate))]
  145. public TimeSpan Booked { get; set; }
  146. [EditorSequence(6)]
  147. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  148. [Aggregate(typeof(JobActivityActualAggregate))]
  149. public TimeSpan Actual { get; set; }
  150. }
  151. public class JobActivity : Entity, IRemotable, IPersistent, IManyToMany<Job, Activity>, ILicense<ProjectManagementLicense>, IJobActivity
  152. {
  153. [EditorSequence(1)]
  154. [EntityRelationship(DeleteAction.Cascade)]
  155. public JobLink JobLink { get; set; }
  156. [EditorSequence(2)]
  157. [EntityRelationship(DeleteAction.SetNull)]
  158. public AssignmentActivityLink ActivityLink { get; set; }
  159. [EditorSequence(3)]
  160. [DurationEditor(Summary = Summary.Sum)]
  161. public TimeSpan Quote { get; set; }
  162. [EditorSequence(4)]
  163. [DurationEditor(Summary = Summary.Sum)]
  164. public TimeSpan Budget { get; set; }
  165. }
  166. }