Job.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using System;
  2. using System.ComponentModel;
  3. using System.Linq.Expressions;
  4. using AutoProperties;
  5. using InABox.Core;
  6. namespace Comal.Classes
  7. {
  8. public interface IJob : IEntity
  9. {
  10. public string JobNumber { get; set; }
  11. }
  12. [UserTracking("Project Management")]
  13. public class Job : Entity, IJob, IPersistent, IRemotable, IScheduleAction, IOneToMany<Schedule>, IStringAutoIncrement<Job>,
  14. ILicense<ProjectManagementLicense>, IExportable, IImportable, IMergeable, IDataEntryInstance
  15. {
  16. public const string NotesPage = "Notes";
  17. #region General
  18. [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  19. [EditorSequence(0)]
  20. public string JobNumber { get; set; }
  21. //[Obsolete("Replaced by JobNumber", true)]
  22. //[IntegerEditor(Editable = Editable.Hidden)]
  23. //public int Number { get; set; }
  24. [TextBoxEditor]
  25. [EditorSequence(1)]
  26. public string Name { get; set; }
  27. [EditorSequence(2)]
  28. [DateEditor]
  29. public DateTime Date { get; set; }
  30. [SecondaryIndex]
  31. [EnumLookupEditor(typeof(JobType))]
  32. [EditorSequence(3)]
  33. public JobType JobType { get; set; } = JobType.Project;
  34. [EditorSequence(4)]
  35. [RequiredColumn]
  36. public CustomerLink Customer { get; set; }
  37. [EditorSequence(5)]
  38. [AddressEditor(true)]
  39. public Address SiteAddress { get; set; }
  40. [EditorSequence(6)]
  41. public ContactLink Contact { get; set; }
  42. [EditorSequence(7)]
  43. [TextBoxEditor]
  44. public String ClientReference { get; set; }
  45. [EditorSequence(8)]
  46. public JobStatusLink JobStatus { get; set; }
  47. #endregion
  48. #region Accounts
  49. [EditorSequence("Accounts",1)]
  50. [Caption("Bill To")]
  51. [RequiredColumn]
  52. public AccountLink Account { get; set; }
  53. [EditorSequence("Accounts",2)]
  54. public JobRetention Retention { get; set; }
  55. #endregion
  56. [NotesEditor]
  57. [EditorSequence(NotesPage, 1)]
  58. public string[] Notes { get; set; } = Array.Empty<string>();
  59. #region Other
  60. [TextBoxEditor]
  61. [EditorSequence("Other", 1)]
  62. public string URL { get; set; }
  63. [ColorEditor]
  64. [EditorSequence("Other", 2)]
  65. public string Color { get; set; }
  66. [EditorSequence("Other", 3)]
  67. [TimestampEditor]
  68. public DateTime DataEntered { get; set; }
  69. [EditorSequence("Other", 4)]
  70. [TextBoxEditor]
  71. public string SourceRef { get; set; }
  72. #endregion
  73. #region Project Management
  74. [Caption("Project Lead")]
  75. [EditorSequence("Project Management", 1)]
  76. public EmployeeLink ProjectLead { get; set; }
  77. [Caption("Drafting Lead")]
  78. [EditorSequence("Project Management", 2)]
  79. public EmployeeLink DraftingLead { get; set; }
  80. [Caption("Site Lead")]
  81. [EditorSequence("Project Management", 3)]
  82. public EmployeeLink SiteLead { get; set; }
  83. [TextBoxEditor]
  84. [EditorSequence("Project Management", 4)]
  85. public string SetoutsFolder { get; set; }
  86. [TimeOfDayEditor]
  87. [EditorSequence("Project Management", 5)]
  88. public TimeSpan UsualStart { get; set; }
  89. [TimeOfDayEditor]
  90. [EditorSequence("Project Management", 5)]
  91. public TimeSpan UsualFinish { get; set; }
  92. [DurationEditor]
  93. [EditorSequence("Project Management", 6)]
  94. public TimeSpan AllowableOvertime { get; set; }
  95. // This is the Activity to which the Usual Start/Finish Applies
  96. // Other activitiy timesheets are not affected by this
  97. [EditorSequence("Project Management", 7)]
  98. public ActivityLink UsualActivity { get; set; }
  99. [EditorSequence("Project Management", 8)]
  100. public DateTime ExpectedCompletionDate { get; set; }
  101. [EditorSequence("Project Management", 8)]
  102. public DateTime Completed { get; set; }
  103. private class JobScopeLookup : LookupDefinitionGenerator<JobScope, Job>
  104. {
  105. public override Filter<JobScope> DefineFilter(Job[] items)
  106. {
  107. var item = items?.Length == 1 ? items[0] : null;
  108. if (item != null)
  109. return new Filter<JobScope>(x => x.Job.ID).IsEqualTo(item.ID).And(x => x.Status.Approved).IsEqualTo(true);
  110. return new Filter<JobScope>(x => x.ID).None();
  111. }
  112. public override Columns<Job> DefineFilterColumns()
  113. => Columns.None<Job>().Add(x=>x.ID);
  114. }
  115. [LookupDefinition(typeof(JobScopeLookup))]
  116. [EditorSequence("Project Management", 10)]
  117. public JobScopeLink DefaultScope { get; set; }
  118. #endregion
  119. [TimeOfDayEditor(Editable = Editable.Hidden)]
  120. public TimeSpan LabourHours { get; set; }
  121. [NullEditor]
  122. [Obsolete("Why does this even exist?")]
  123. public ProductStyleLink Style { get; set; }
  124. [NullEditor]
  125. [Aggregate(typeof(JobAssignmentCount))]
  126. public int Assignments { get; set; }
  127. [NullEditor]
  128. [Aggregate(typeof(JobOpenAssignmentCount))]
  129. public int OpenAssignments { get; set; }
  130. [NullEditor]
  131. public ScheduleLink ScheduleLink { get; set; }
  132. [DoNotPersist]
  133. [DoNotSerialize]
  134. [InterceptIgnore]
  135. public static String JobNumberPrefix { get; set; }
  136. public Expression<Func<Job, string>> AutoIncrementField() => x => x.JobNumber;
  137. public Filter<Job>? AutoIncrementFilter() => null;
  138. public String AutoIncrementPrefix() => JobNumberPrefix;
  139. public string AutoIncrementFormat() => "{0:D4}";
  140. public int AutoIncrementDefault() => 1;
  141. [NullEditor]
  142. [Obsolete("Replaced with ProjectLead", true)]
  143. public EmployeeLink ManagerLink { get; set; }
  144. [NullEditor]
  145. [Obsolete("Replaced with SiteLead", true)]
  146. public EmployeeLink EmployeeLink { get; set; }
  147. protected override void Init()
  148. {
  149. base.Init();
  150. Customer.Account.PropertyChanged += Account_PropertyChanged;
  151. Customer.Delivery.PropertyChanged += Delivery_PropertyChanged;
  152. }
  153. private void Delivery_PropertyChanged(object sender, PropertyChangedEventArgs e)
  154. {
  155. var value = CoreUtils.GetPropertyValue(Customer.Delivery, e.PropertyName);
  156. CoreUtils.SetPropertyValue(SiteAddress, e.PropertyName, value);
  157. }
  158. private void Account_PropertyChanged(object sender, PropertyChangedEventArgs e)
  159. {
  160. if (e.PropertyName.Equals("ID"))
  161. Account.ID = Customer.Account.ID;
  162. else if (e.PropertyName.Equals("Code"))
  163. Account.Code = Customer.Account.Code;
  164. else if (e.PropertyName.Equals("Name"))
  165. Account.Name = Customer.Account.Name;
  166. }
  167. public override string ToString()
  168. {
  169. return string.Format("{0}: {1}", JobNumber, Name);
  170. }
  171. static Job()
  172. {
  173. LinkedProperties.Register<Job, ContactLink, Guid>(x => x.Customer.DefaultContact, x => x.ID, x => x.Contact.ID);
  174. LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.Street, x=>x.SiteAddress.Street);
  175. LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.City, x=>x.SiteAddress.City);
  176. LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.PostCode, x=>x.SiteAddress.PostCode);
  177. LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.State, x=>x.SiteAddress.State);
  178. LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.Location.Address, x=>x.SiteAddress.Location.Address);
  179. LinkedProperties.Register<Job,Address,double>(x=>x.Customer.Delivery, x=>x.Location.Latitude, x=>x.SiteAddress.Location.Latitude);
  180. LinkedProperties.Register<Job,Address,double>(x=>x.Customer.Delivery, x=>x.Location.Longitude, x=>x.SiteAddress.Location.Longitude);
  181. LinkedProperties.Register<Job,Address,DateTime>(x=>x.Customer.Delivery, x=>x.Location.Timestamp, x=>x.SiteAddress.Location.Timestamp);
  182. LinkedProperties.Register<Job, AccountLink, Guid>(x => x.Customer.Account, x => x.ID, x => x.Account.ID);
  183. DefaultColumns.Add<Job>(x => x.JobNumber, width: 50, caption: "Job #");
  184. DefaultColumns.Add<Job>(x => x.Name);
  185. }
  186. }
  187. }