JobStage.cs 7.1 KB

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