using System; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { //public class DeliveryAssignments : CoreAggregate //{ // public override Expression> Aggregate => Delivery => Delivery.ID; // //public Expression> Link => x => x.Assignment.ID; // public override AggregateCalculation Calculation => AggregateCalculation.Count; // public override Dictionary>, Expression>> Links => // new Dictionary>, Expression>> // { // { Delivery => Delivery.Assignment.ID, x => x.ID } // }; //} /// /// An assignment represents an anticipated booking for an employee, much like a diary entry /// /// [UserTracking("Assignments")] [Caption("Assignments")] public class Assignment : Entity, IPersistent, IRemotable, INumericAutoIncrement, IOneToMany, IOneToMany, IOneToMany, ILicense, IJobActivity, IOneToMany { private bool bChanging; [IntegerEditor(Editable = Editable.Hidden)] [EditorSequence(1)] public int Number { get; set; } [DateEditor] [EditorSequence(2)] public DateTime Date { get; set; } [EntityRelationship(DeleteAction.Cascade)] [EditorSequence(3)] public EmployeeLink EmployeeLink { get; set; } [TextBoxEditor] [EditorSequence(4)] public string Title { get; set; } [MemoEditor] [EditorSequence(5)] public string Description { get; set; } [EditorSequence(6)] public AssignmentActivityLink ActivityLink { get; set; } [EditorSequence(7)] [EntityRelationship(DeleteAction.SetNull)] public KanbanLink Task { get; set; } [EditorSequence(8)] public JobLink JobLink { get; set; } [EditorSequence(9)] public JobITPLink ITP { get; set; } [NullEditor] [Obsolete("Replaced with Actual.Start", true)] public TimeSpan Start { get; set; } [NullEditor] [Obsolete("Replaced with Actual.Duration", true)] public TimeSpan Duration { get; set; } [NullEditor] [Obsolete("Replaced with Actual.Finish", true)] public TimeSpan Finish { get; set; } [EditorSequence(10)] [CoreTimeEditor] public TimeBlock Booked { get; set; } [EditorSequence(11)] [CoreTimeEditor] public TimeBlock Actual { get; set; } [TimestampEditor] [EditorSequence(12)] public DateTime Completed { get; set; } [EditorSequence("Processing",1)] public ActualCharge Charge { get; set; } [TimestampEditor] [EditorSequence("Processing",2)] public DateTime Processed { get; set; } [NullEditor] [EntityRelationship(DeleteAction.Cascade)] public LeaveRequestLink LeaveRequestLink { get; set; } [NullEditor] public DeliveryLink Delivery { get; set; } [NullEditor] [EntityRelationship(DeleteAction.SetNull)] public InvoiceLink Invoice { get; set; } [NullEditor] public MeetingDetails Meeting { get; set; } public Expression> AutoIncrementField() { return x => x.Number; } public Filter AutoIncrementFilter() { return null; } protected override void Init() { base.Init(); JobLink = new JobLink(); ITP = new JobITPLink(); EmployeeLink = new EmployeeLink(); LeaveRequestLink = new LeaveRequestLink(); ActivityLink = new AssignmentActivityLink(); Invoice = new InvoiceLink(); Delivery = new DeliveryLink(); Task = new KanbanLink(); Booked = new TimeBlock(); Actual = new TimeBlock(); Charge = new ActualCharge(); Meeting = new MeetingDetails(); } public static TimeSpan EffectiveTime(TimeSpan actual, TimeSpan booked) => actual.Ticks != 0L ? actual : booked; public DateTime EffectiveStart() { return Date.Add(EffectiveTime(Actual.Start, Booked.Start)); } public DateTime EffectiveFinish() { // If we have an actual finish, always use that // otherwise use EffectiveStart() + booked.duration return Date.Add( EffectiveTime( Actual.Finish, EffectiveTime(Actual.Start, Booked.Start) .Add(Booked.Duration) ) ); } static Assignment() { LinkedProperties.Register(ass => ass.ActivityLink.Charge, chg => chg.Chargeable, ass => ass.Charge.Chargeable); } } }