Job.cs 7.1 KB

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