JobStage.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using InABox.Core;
  6. namespace Comal.Classes
  7. {
  8. public class JobStageJobLookup : LookupDefinitionGenerator<JobStage, Job>
  9. {
  10. public override Filter<JobStage> DefineFilter(Job[] items)
  11. {
  12. if (items.Length == 1)
  13. return new Filter<JobStage>(x => x.Job.ID).IsEqualTo(items.First().ID).And(x => x.IsHeader).IsEqualTo(false);
  14. return new Filter<JobStage>(x => x.ID).IsEqualTo(Guid.Empty);
  15. }
  16. public override Columns<Job> DefineFilterColumns()
  17. => Columns.None<Job>().Add(x => x.ID);
  18. }
  19. [UserTracking("Gantt Charts")]
  20. public class JobStageType : Entity, IRemotable, IPersistent, ILicense<ProjectManagementLicense>
  21. {
  22. [EditorSequence(1)]
  23. [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  24. public string Code { get; set; }
  25. [EditorSequence(2)]
  26. public string Description { get; set; }
  27. [EditorSequence(3)]
  28. [ColorEditor]
  29. public string Color { get; set; }
  30. }
  31. public class JobStageTypeLink : EntityLink<JobStageType>
  32. {
  33. [CodePopupEditor(typeof(JobStageType), CanAdd = true)]
  34. public override Guid ID { get; set; }
  35. [EditorSequence(1)]
  36. [CodeEditor(Visible = Visible.Default, Editable = Editable.Hidden)]
  37. public string Code { get; set; }
  38. [EditorSequence(2)]
  39. [CodeEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
  40. public string Description { get; set; }
  41. [EditorSequence(3)]
  42. [ColorEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
  43. public string Color { get; set; }
  44. }
  45. public class JobStageTypeLookups : EntityLookup<JobStageType>
  46. {
  47. public override Filter<JobStageType> DefineFilter()
  48. => new Filter<JobStageType>().All();
  49. public override Columns<JobStageType> DefineColumns()
  50. => Columns.None<JobStageType>()
  51. .Add(x => x.ID)
  52. .Add(x => x.Code)
  53. .Add(x => x.Description)
  54. .Add(x=>x.Color);
  55. public override SortOrder<JobStageType>? DefineSortOrder()
  56. => new SortOrder<JobStageType>(x=>x.Code, SortDirection.Ascending);
  57. public override string FormatLookup(Dictionary<string, object?> values, IEnumerable<string> exclude)
  58. => values.TryGetValue("Description", out var description) ? description?.ToString() ?? "" : "";
  59. }
  60. [UserTracking("Gantt Charts")]
  61. public class JobStage : Entity, IRemotable, IPersistent, ISequenceable, INotifyPropertyChanged, ILicense<ProjectManagementLicense>, IOneToMany<Job>,
  62. IChildEntityLookup<Job, JobStage, JobStageJobLookup>
  63. {
  64. private bool bChanging;
  65. [EntityRelationship(DeleteAction.Cascade)]
  66. [EditorSequence(0)]
  67. public JobLink Job { get; set; }
  68. [NullEditor]
  69. public bool IsHeader { get; set; }
  70. private class JobStageLookup : LookupDefinitionGenerator<JobStage, JobStage>
  71. {
  72. public override Filter<JobStage> DefineFilter(JobStage[] items)
  73. {
  74. if (items.Length == 1)
  75. return new Filter<JobStage>(x => x.Job.ID).IsEqualTo(items.First().Job.ID).And(x => x.IsHeader).IsEqualTo(false);
  76. return new Filter<JobStage>(x => x.ID).IsEqualTo(Guid.Empty);
  77. }
  78. public override Columns<JobStage> DefineFilterColumns()
  79. => Columns.None<JobStage>().Add(x => x.Job.ID);
  80. }
  81. [LookupDefinition(typeof(JobStageLookup))]
  82. [NullEditor]
  83. public JobStageLink Parent { get; set; }
  84. [EditorSequence(1)]
  85. public JobStageTypeLink Type { get; set; }
  86. [EditorSequence(2)]
  87. public string Name { get; set; }
  88. [EditorSequence(3)]
  89. [NullEditor]
  90. public JobStageCalendarLink Calendar { get; set; }
  91. [DateEditor]
  92. [EditorSequence(4)]
  93. public DateTime StartDate { get; set; }
  94. [IntegerEditor]
  95. [EditorSequence(5)]
  96. public int WorkDays { get; set; }
  97. [DateEditor]
  98. [EditorSequence(6)]
  99. public DateTime EndDate { get; set; }
  100. [DoubleEditor]
  101. [EditorSequence(7)]
  102. public double SupervisionHours { get; set; }
  103. [DoubleEditor]
  104. [EditorSequence(8)]
  105. public double TradesHours { get; set; }
  106. [DoubleEditor]
  107. [EditorSequence(9)]
  108. public double ApprenticeHours { get; set; }
  109. [DoubleEditor(Editable = Editable.Disabled)]
  110. [EditorSequence("Summary", 1)]
  111. public double TotalHours { get; set; }
  112. [DoubleEditor(Editable = Editable.Disabled)]
  113. [EditorSequence("Summary", 2)]
  114. public double Supervisors { get; set; }
  115. [DoubleEditor(Editable = Editable.Disabled)]
  116. [EditorSequence("Summary", 3)]
  117. public double Tradespersons { get; set; }
  118. [DoubleEditor(Editable = Editable.Disabled)]
  119. [EditorSequence("Summary", 4)]
  120. public double Apprentices { get; set; }
  121. [NullEditor]
  122. public long Sequence { get; set; }
  123. protected override void DoPropertyChanged(string name, object? before, object? after)
  124. {
  125. base.DoPropertyChanged(name, before, after);
  126. if (bChanging)
  127. return;
  128. bChanging = true;
  129. if (name.Equals("WorkDays"))
  130. {
  131. EndDate = Calendar.CalculateEndDate(StartDate, (int)after);
  132. Tradespersons = Calendar.CalculateWorkers(StartDate, EndDate, TradesHours);
  133. Supervisors = Calendar.CalculateWorkers(StartDate, EndDate, SupervisionHours);
  134. Apprentices = Calendar.CalculateWorkers(StartDate, EndDate, ApprenticeHours);
  135. }
  136. else if (name.Equals("EndDate"))
  137. {
  138. WorkDays = Calendar.CalculateWorkDays(StartDate, (DateTime)after);
  139. Tradespersons = Calendar.CalculateWorkers(StartDate, (DateTime)after, TradesHours);
  140. Supervisors = Calendar.CalculateWorkers(StartDate, (DateTime)after, SupervisionHours);
  141. Apprentices = Calendar.CalculateWorkers(StartDate, (DateTime)after, ApprenticeHours);
  142. }
  143. else if (name.Equals("TradesHours"))
  144. {
  145. Tradespersons = Calendar.CalculateWorkers(StartDate, EndDate, (double)after);
  146. TotalHours = SupervisionHours + (double)after + ApprenticeHours;
  147. }
  148. else if (name.Equals("SupervisionHours"))
  149. {
  150. Supervisors = Calendar.CalculateWorkers(StartDate, EndDate, (double)after);
  151. TotalHours = (double)after + TradesHours + ApprenticeHours;
  152. }
  153. else if (name.Equals("ApprenticeHours"))
  154. {
  155. Apprentices = Calendar.CalculateWorkers(StartDate, EndDate, (double)after);
  156. TotalHours = SupervisionHours + TradesHours + (double)after;
  157. }
  158. bChanging = false;
  159. }
  160. }
  161. }