Assignment.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Linq.Expressions;
  3. using InABox.Core;
  4. namespace Comal.Classes
  5. {
  6. //public class DeliveryAssignments : CoreAggregate<Assignment, Delivery, Guid>
  7. //{
  8. // public override Expression<Func<Delivery, Guid>> Aggregate => Delivery => Delivery.ID;
  9. // //public Expression<Func<Delivery, Guid>> Link => x => x.Assignment.ID;
  10. // public override AggregateCalculation Calculation => AggregateCalculation.Count;
  11. // public override Dictionary<Expression<Func<Delivery, object>>, Expression<Func<Assignment, object>>> Links =>
  12. // new Dictionary<Expression<Func<Delivery, object>>, Expression<Func<Assignment, object>>>
  13. // {
  14. // { Delivery => Delivery.Assignment.ID, x => x.ID }
  15. // };
  16. //}
  17. /// <summary>
  18. /// An assignment represents an anticipated booking for an employee, much like a diary entry
  19. /// <exclude />
  20. /// </summary>
  21. [UserTracking("Assignments")]
  22. [Caption("Assignments")]
  23. public class Assignment : Entity, IPersistent, IRemotable, INumericAutoIncrement<Assignment>, IOneToMany<Employee>, IOneToMany<Job>,
  24. IOneToMany<Kanban>, ILicense<SchedulingControlLicense>, IJobActivity, IOneToMany<Invoice>, IJobScopedItem
  25. {
  26. [IntegerEditor(Editable = Editable.Hidden)]
  27. [EditorSequence(1)]
  28. public int Number { get; set; }
  29. [DateEditor]
  30. [EditorSequence(2)]
  31. public DateTime Date { get; set; }
  32. [EntityRelationship(DeleteAction.Cascade)]
  33. [EditorSequence(3)]
  34. public EmployeeLink EmployeeLink { get; set; }
  35. [TextBoxEditor]
  36. [EditorSequence(4)]
  37. public string Title { get; set; }
  38. [MemoEditor]
  39. [EditorSequence(5)]
  40. public string Description { get; set; }
  41. [EditorSequence(6)]
  42. public AssignmentActivityLink ActivityLink { get; set; }
  43. [EditorSequence(7)]
  44. [EntityRelationship(DeleteAction.SetNull)]
  45. public KanbanLink Task { get; set; }
  46. [EditorSequence(8)]
  47. public JobLink JobLink { get; set; }
  48. [EditorSequence(9)]
  49. public JobITPLink ITP { get; set; }
  50. [NullEditor]
  51. [Obsolete("Replaced with Actual.Start", true)]
  52. public TimeSpan Start { get; set; }
  53. [NullEditor]
  54. [Obsolete("Replaced with Actual.Duration", true)]
  55. public TimeSpan Duration { get; set; }
  56. [NullEditor]
  57. [Obsolete("Replaced with Actual.Finish", true)]
  58. public TimeSpan Finish { get; set; }
  59. [EditorSequence(10)]
  60. [CoreTimeEditor]
  61. public TimeBlock Booked { get; set; }
  62. [EditorSequence(11)]
  63. [CoreTimeEditor]
  64. public TimeBlock Actual { get; set; }
  65. [TimestampEditor]
  66. [RequiredColumn]
  67. [EditorSequence(12)]
  68. public DateTime Completed { get; set; }
  69. [EditorSequence("Processing",1)]
  70. public ActualCharge Charge { get; set; }
  71. [TimestampEditor]
  72. [EditorSequence("Processing",2)]
  73. public DateTime Processed { get; set; }
  74. [NullEditor]
  75. [EntityRelationship(DeleteAction.Cascade)]
  76. public LeaveRequestLink LeaveRequestLink { get; set; }
  77. [NullEditor]
  78. public DeliveryLink Delivery { get; set; }
  79. [NullEditor]
  80. [EntityRelationship(DeleteAction.SetNull)]
  81. public InvoiceLink Invoice { get; set; }
  82. [NullEditor]
  83. public MeetingDetails Meeting { get; set; }
  84. public JobScopeLink JobScope { get; set; }
  85. public Expression<Func<Assignment, int>> AutoIncrementField()
  86. {
  87. return x => x.Number;
  88. }
  89. public Filter<Assignment> AutoIncrementFilter()
  90. {
  91. return null;
  92. }
  93. public static TimeSpan EffectiveTime(TimeSpan actual, TimeSpan booked) => actual.Ticks != 0L ? actual : booked;
  94. public TimeSpan EffectiveStartTime()
  95. {
  96. return EffectiveTime(Actual.Start, Booked.Start);
  97. }
  98. public DateTime EffectiveStart()
  99. {
  100. return Date.Add(EffectiveStartTime());
  101. }
  102. public TimeSpan EffectiveFinishTime()
  103. {
  104. // If we have an actual finish, always use that
  105. // otherwise use EffectiveStart() + booked.duration
  106. return EffectiveTime(
  107. Actual.Finish,
  108. EffectiveTime(Actual.Start, Booked.Start)
  109. .Add(Booked.Duration)
  110. );
  111. }
  112. public DateTime EffectiveFinish()
  113. {
  114. return Date.Add(
  115. EffectiveFinishTime()
  116. );
  117. }
  118. static Assignment()
  119. {
  120. LinkedProperties.Register<Assignment, ActivityCharge, bool>(ass => ass.ActivityLink.Charge, chg => chg.Chargeable, ass => ass.Charge.Chargeable);
  121. Classes.JobScope.LinkScopeProperties<Assignment>();
  122. }
  123. }
  124. }