JobActivity.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. new Columns<Activity>(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.Duration;
  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 interface IJobActivity
  70. {
  71. JobLink JobLink { get; set; }
  72. AssignmentActivityLink ActivityLink { get; set; }
  73. }
  74. public class JobActivityAssignmentUnionGenerator : AutoEntityUnionGenerator<IJobActivity>
  75. {
  76. protected override void Configure()
  77. {
  78. AddTable<JobActivity>();
  79. AddTable<Assignment>();
  80. }
  81. public override bool Distinct => true;
  82. public override Column<IJobActivity>[] IDColumns => new Column<IJobActivity>[]
  83. {
  84. new Column<IJobActivity>(x => x.JobLink.ID),
  85. new Column<IJobActivity>(x => x.ActivityLink.ID)
  86. };
  87. }
  88. [AutoEntity(typeof(JobActivityAssignmentUnionGenerator))]
  89. public class JobActivitySummary : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany<Job>, ILicense<ProjectManagementLicense>
  90. {
  91. [NullEditor]
  92. public JobLink JobLink { get; set; }
  93. [EditorSequence(1)]
  94. [Caption("Activity",IncludePath = false)]
  95. public AssignmentActivityLink ActivityLink { get; set; }
  96. [EditorSequence(2)]
  97. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  98. [Aggregate(typeof(JobActivityBudgetAggregate))]
  99. public TimeSpan Budget { get; set; }
  100. [EditorSequence(3)]
  101. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  102. [Aggregate(typeof(JobActivityBookedAggregate))]
  103. public TimeSpan Booked { get; set; }
  104. [EditorSequence(3)]
  105. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  106. [Aggregate(typeof(JobActivityActualAggregate))]
  107. public TimeSpan Actual { get; set; }
  108. }
  109. public class JobActivity : Entity, IRemotable, IPersistent, IManyToMany<Job, Activity>, ILicense<ProjectManagementLicense>, IJobActivity
  110. {
  111. [EditorSequence(1)]
  112. [EntityRelationship(DeleteAction.Cascade)]
  113. public JobLink JobLink { get; set; }
  114. [EditorSequence(2)]
  115. [EntityRelationship(DeleteAction.SetNull)]
  116. public AssignmentActivityLink ActivityLink { get; set; }
  117. [EditorSequence(3)]
  118. [DurationEditor(Summary = Summary.Sum)]
  119. public TimeSpan Duration { get; set; }
  120. }
  121. }