JobActivity.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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 JobActivityBudgetAggregate : CoreAggregate<JobActivitySummary, JobActivity, TimeSpan>
  59. {
  60. public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Budget;
  61. public override Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  62. new Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>>()
  63. {
  64. { JobActivity => JobActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  65. { JobActivity => JobActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  66. };
  67. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  68. }
  69. public class JobActivityQuoteAggregate : CoreAggregate<JobActivitySummary, JobActivity, TimeSpan>
  70. {
  71. public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Quote;
  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 interface IJobActivity
  81. {
  82. JobLink JobLink { get; set; }
  83. AssignmentActivityLink ActivityLink { get; set; }
  84. }
  85. public class JobActivityAssignmentUnionGenerator : AutoEntityUnionGenerator<IJobActivity>
  86. {
  87. protected override void Configure()
  88. {
  89. AddTable<JobActivity>();
  90. AddTable<Assignment>();
  91. }
  92. public override bool Distinct => true;
  93. public override Column<IJobActivity>[] IDColumns => new Column<IJobActivity>[]
  94. {
  95. new Column<IJobActivity>(x => x.JobLink.ID),
  96. new Column<IJobActivity>(x => x.ActivityLink.ID)
  97. };
  98. }
  99. [AutoEntity(typeof(JobActivityAssignmentUnionGenerator))]
  100. public class JobActivitySummary : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany<Job>, ILicense<ProjectManagementLicense>
  101. {
  102. [NullEditor]
  103. public JobLink JobLink { get; set; }
  104. [EditorSequence(1)]
  105. [Caption("Activity",IncludePath = false)]
  106. public AssignmentActivityLink ActivityLink { get; set; }
  107. [EditorSequence(2)]
  108. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  109. [Aggregate(typeof(JobActivityQuoteAggregate))]
  110. public TimeSpan Quote { get; set; }
  111. [EditorSequence(3)]
  112. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  113. [Aggregate(typeof(JobActivityBudgetAggregate))]
  114. public TimeSpan Budget { get; set; }
  115. [EditorSequence(4)]
  116. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  117. [Aggregate(typeof(JobActivityBookedAggregate))]
  118. public TimeSpan Booked { get; set; }
  119. [EditorSequence(5)]
  120. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  121. [Aggregate(typeof(JobActivityActualAggregate))]
  122. public TimeSpan Actual { get; set; }
  123. }
  124. public class JobActivity : Entity, IRemotable, IPersistent, IManyToMany<Job, Activity>, ILicense<ProjectManagementLicense>, IJobActivity
  125. {
  126. [EditorSequence(1)]
  127. [EntityRelationship(DeleteAction.Cascade)]
  128. public JobLink JobLink { get; set; }
  129. [EditorSequence(2)]
  130. [EntityRelationship(DeleteAction.SetNull)]
  131. public AssignmentActivityLink ActivityLink { get; set; }
  132. [EditorSequence(3)]
  133. [DurationEditor(Summary = Summary.Sum)]
  134. public TimeSpan Quote { get; set; }
  135. [EditorSequence(4)]
  136. [DurationEditor(Summary = Summary.Sum)]
  137. public TimeSpan Budget { get; set; }
  138. }
  139. }