Delivery.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using InABox.Clients;
  7. using InABox.Core;
  8. namespace Comal.Classes
  9. {
  10. [Caption("Digital Forms")]
  11. [UserTracking("Digital Forms")]
  12. public class DeliveryForm : EntityForm<Delivery, DeliveryLink, DeliveryForm>, IDigitalForm<Delivery>
  13. {
  14. public override string AutoIncrementPrefix() => "DF";
  15. }
  16. public class DeliveryDocumentCount : CoreAggregate<Delivery, DeliveryDocument, Guid>
  17. {
  18. public override Expression<Func<DeliveryDocument, Guid>> Aggregate => x => x.ID;
  19. public override AggregateCalculation Calculation => AggregateCalculation.Count;
  20. public override Dictionary<Expression<Func<DeliveryDocument, object>>, Expression<Func<Delivery, object>>> Links =>
  21. new Dictionary<Expression<Func<DeliveryDocument, object>>, Expression<Func<Delivery, object>>>()
  22. {
  23. { DeliveryDocument => DeliveryDocument.EntityLink.ID, Delivery => Delivery.ID }
  24. };
  25. }
  26. [UserTracking("Logistics")]
  27. [Caption("Deliveries")]
  28. public class Delivery : Entity, IPersistent, IRemotable, INumericAutoIncrement<Delivery>, IOneToMany<Assignment>, ILicense<LogisticsLicense>,
  29. IExportable, IImportable
  30. {
  31. [EditorSequence(1)]
  32. [IntegerEditor]
  33. public int Number { get; set; }
  34. [EditorSequence(2)]
  35. public DeliveryTypeLink Type { get; set; }
  36. [EditorSequence(3)]
  37. [RequiredColumn]
  38. public JobLink Job { get; set; }
  39. [EditorSequence(4)]
  40. public Address Address { get; set; }
  41. [EditorSequence(5)]
  42. public ContactLink Contact { get; set; }
  43. [EditorSequence(6)]
  44. [MemoEditor]
  45. public string Notes { get; set; }
  46. [EntityRelationship(DeleteAction.SetNull)]
  47. [EditorSequence(7)]
  48. public AssignmentLink Assignment { get; set; }
  49. [EditorSequence(8)]
  50. public EmployeeLink Employee { get; set; }
  51. [DateTimeEditor]
  52. [EditorSequence(9)]
  53. public DateTime Due { get; set; }
  54. [Aggregate(typeof(DeliveryDocumentCount))]
  55. [IntegerEditor(Editable = Editable.Hidden)]
  56. public int Documents { get; set; }
  57. [TimestampEditor]
  58. [EditorSequence(10)]
  59. public DateTime Delivered { get; set; }
  60. [EditorSequence(11)]
  61. public EmployeeLink DeliveredBy { get; set; }
  62. [NullEditor]
  63. public Location Location { get; set; }
  64. [TimestampEditor(Editable = Editable.Disabled)]
  65. [EditorSequence(12)]
  66. public DateTime Completed { get; set; }
  67. [NullEditor]
  68. public int KanbanNumber { get; set; } = 0;
  69. public Expression<Func<Delivery, int>> AutoIncrementField()
  70. {
  71. return x => x.Number;
  72. }
  73. public Filter<Delivery> AutoIncrementFilter()
  74. {
  75. return null;
  76. }
  77. //this only refers to a kanban generated by the deliveries mobile app - not a kanban which may have generated the delivery
  78. protected override void Init()
  79. {
  80. base.Init();
  81. Job.PropertyChanged += Job_PropertyChanged;
  82. Contact.PropertyChanged += Contact_PropertyChanged;
  83. }
  84. private void Contact_PropertyChanged(object sender, PropertyChangedEventArgs e)
  85. {
  86. if (string.Equals(e.PropertyName, "ID"))
  87. {
  88. var contactLink = (sender as ContactLink)!;
  89. CoreTable results = null;
  90. if (contactLink.IsValid())
  91. results = new Client<Contact>().Query(
  92. new Filter<Contact>(x => x.ID).IsEqualTo(contactLink.ID),
  93. Columns.None<Contact>().Add(
  94. x => x.Address.Street,
  95. x => x.Address.City,
  96. x => x.Address.State,
  97. x => x.Address.PostCode
  98. )
  99. );
  100. var row = results?.Rows.FirstOrDefault();
  101. Address.Street = row != null ? row.Get<Contact, string>(x => x.Address.Street) : "";
  102. Address.City = row != null ? row.Get<Contact, string>(x => x.Address.City) : "";
  103. Address.State = row != null ? row.Get<Contact, string>(x => x.Address.State) : "";
  104. Address.PostCode = row != null ? row.Get<Contact, string>(x => x.Address.PostCode) : "";
  105. }
  106. }
  107. private void Job_PropertyChanged(object sender, PropertyChangedEventArgs e)
  108. {
  109. //if (string.Equals(e.PropertyName, "ID") && !Contact.IsValid())
  110. //{
  111. // var jobLink = sender as JobLink;
  112. // CoreTable results = null;
  113. // if (jobLink.IsValid())
  114. // results = new Client<Job>().Query(
  115. // new Filter<Job>(x => x.ID).IsEqualTo(jobLink.ID),
  116. // new Columns<Job>(
  117. // x => x.SiteAddress.Street,
  118. // x => x.SiteAddress.City,
  119. // x => x.SiteAddress.State,
  120. // x => x.SiteAddress.PostCode
  121. // )
  122. // );
  123. // var row = results?.Rows.FirstOrDefault();
  124. // Address.Street = row != null ? row.Get<Job, string>(x => x.SiteAddress.Street) : "";
  125. // Address.City = row != null ? row.Get<Job, string>(x => x.SiteAddress.City) : "";
  126. // Address.State = row != null ? row.Get<Job, string>(x => x.SiteAddress.State) : "";
  127. // Address.PostCode = row != null ? row.Get<Job, string>(x => x.SiteAddress.PostCode) : "";
  128. //}
  129. }
  130. static Delivery()
  131. {
  132. LinkedProperties.Register<Delivery,ContactLink,Guid>(x=>x.Job.Contact, x=>x.ID, x=>x.Contact.ID);
  133. LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.Street, x=>x.Address.Street);
  134. LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.City, x=>x.Address.City);
  135. LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.PostCode, x=>x.Address.PostCode);
  136. LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.State, x=>x.Address.State);
  137. LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.Location.Address, x=>x.Address.Location.Address);
  138. LinkedProperties.Register<Delivery,Address,double>(x=>x.Job.SiteAddress, x=>x.Location.Latitude, x=>x.Address.Location.Latitude);
  139. LinkedProperties.Register<Delivery,Address,double>(x=>x.Job.SiteAddress, x=>x.Location.Longitude, x=>x.Address.Location.Longitude);
  140. LinkedProperties.Register<Delivery,Address,DateTime>(x=>x.Job.SiteAddress, x=>x.Location.Timestamp, x=>x.Address.Location.Timestamp);
  141. LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.Street, x=>x.Address.Street);
  142. LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.City, x=>x.Address.City);
  143. LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.PostCode, x=>x.Address.PostCode);
  144. LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.State, x=>x.Address.State);
  145. LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.Location.Address, x=>x.Address.Location.Address);
  146. LinkedProperties.Register<Delivery,Address,double>(x=>x.Contact.Address, x=>x.Location.Latitude, x=>x.Address.Location.Latitude);
  147. LinkedProperties.Register<Delivery,Address,double>(x=>x.Contact.Address, x=>x.Location.Longitude, x=>x.Address.Location.Longitude);
  148. LinkedProperties.Register<Delivery,Address,DateTime>(x=>x.Contact.Address, x=>x.Location.Timestamp, x=>x.Address.Location.Timestamp);
  149. }
  150. #region Move to Assignments?
  151. [NullEditor]
  152. public DateTime Date { get; set; }
  153. [NullEditor]
  154. public TimeSpan Start { get; set; }
  155. [NullEditor]
  156. public TimeSpan Finish { get; set; }
  157. private bool bChanging;
  158. protected override void DoPropertyChanged(string name, object? before, object? after)
  159. {
  160. base.DoPropertyChanged(name, before, after);
  161. if (bChanging)
  162. return;
  163. bChanging = true;
  164. if (name.Equals("Start"))
  165. Finish = ((TimeSpan)after).Add(Duration);
  166. else if (name.Equals("Finish"))
  167. Duration = ((TimeSpan)after).Subtract(Start);
  168. else if (name.Equals("Duration")) Finish = Start.Add((TimeSpan)after);
  169. bChanging = false;
  170. }
  171. [NullEditor]
  172. public TimeSpan Duration { get; set; }
  173. #endregion
  174. }
  175. }