JobActivity.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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.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 JobActivityBudgetAggregate : CoreAggregate<JobActivitySummary, JobActivity, TimeSpan>
  48. {
  49. public override Expression<Func<JobActivity, TimeSpan>> Aggregate => x => x.Duration;
  50. public override Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>> Links =>
  51. new Dictionary<Expression<Func<JobActivity, object>>, Expression<Func<JobActivitySummary, object>>>()
  52. {
  53. { JobActivity => JobActivity.JobLink.ID, JobActivitySummary => JobActivitySummary.JobLink.ID },
  54. { JobActivity => JobActivity.ActivityLink.ID, JobActivitySummary => JobActivitySummary.ActivityLink.ID }
  55. };
  56. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  57. }
  58. public interface IJobActivity
  59. {
  60. JobLink JobLink { get; set; }
  61. AssignmentActivityLink ActivityLink { get; set; }
  62. }
  63. public class JobActivityAssignmentUnionGenerator : AutoEntityUnionGenerator<IJobActivity>
  64. {
  65. protected override void Configure()
  66. {
  67. AddTable<JobActivity>();
  68. AddTable<Assignment>();
  69. }
  70. public override bool Distinct => true;
  71. public override Column<IJobActivity>[] IDColumns => new Column<IJobActivity>[]
  72. {
  73. new Column<IJobActivity>(x => x.JobLink.ID),
  74. new Column<IJobActivity>(x => x.ActivityLink.ID)
  75. };
  76. }
  77. [AutoEntity(typeof(JobActivityAssignmentUnionGenerator))]
  78. public class JobActivitySummary : Entity, IRemotable, IPersistent, IJobActivity, IOneToMany<Job>
  79. {
  80. [NullEditor]
  81. [EntityRelationship(DeleteAction.Cascade)]
  82. public JobLink JobLink { get; set; }
  83. [EditorSequence(1)]
  84. [EntityRelationship(DeleteAction.SetNull)]
  85. [Caption("Activity",IncludePath = false)]
  86. public AssignmentActivityLink ActivityLink { get; set; }
  87. [EditorSequence(2)]
  88. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  89. [Aggregate(typeof(JobActivityBudgetAggregate))]
  90. public TimeSpan Budget { get; set; }
  91. [EditorSequence(3)]
  92. [DurationEditor(Visible = Visible.Default, Summary = Summary.Sum)]
  93. [Aggregate(typeof(JobActivityActualAggregate))]
  94. public TimeSpan Actual { get; set; }
  95. protected override void Init()
  96. {
  97. base.Init();
  98. JobLink = new JobLink();
  99. ActivityLink = new AssignmentActivityLink();
  100. }
  101. }
  102. public class JobActivity : Entity, IRemotable, IPersistent, IManyToMany<Job, Activity>, ILicense<ProjectManagementLicense>, IJobActivity
  103. {
  104. [EditorSequence(1)]
  105. [EntityRelationship(DeleteAction.Cascade)]
  106. public JobLink JobLink { get; set; }
  107. [EditorSequence(2)]
  108. [EntityRelationship(DeleteAction.SetNull)]
  109. public AssignmentActivityLink ActivityLink { get; set; }
  110. [EditorSequence(3)]
  111. [DurationEditor(Summary = Summary.Sum)]
  112. public TimeSpan Duration { get; set; }
  113. protected override void Init()
  114. {
  115. base.Init();
  116. JobLink = new JobLink();
  117. ActivityLink = new AssignmentActivityLink();
  118. }
  119. }
  120. }