using System; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { /// /// An EquipmentAssignment represents an anticipated booking for an equipment item, much like a diary entry /// /// [UserTracking("Assignments")] [Caption("Assignments")] public class EquipmentAssignment : Entity, IPersistent, IRemotable, INumericAutoIncrement, IOneToMany, IOneToMany, ILicense, IOneToMany, IJobScopedItem { [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 EquipmentLink Equipment { get; set; } [MemoEditor] [EditorSequence(6)] public string Description { get; set; } [EditorSequence(9)] public JobLink JobLink { get; set; } [EditorSequence(10)] public JobScopeLink JobScope { get; set; } [EditorSequence(11)] [CoreTimeEditor] public TimeBlock Booked { get; set; } [EditorSequence(12)] [CoreTimeEditor] public TimeBlock Actual { get; set; } [TimestampEditor] [RequiredColumn] [EditorSequence(13)] 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.SetNull)] public InvoiceLink Invoice { get; set; } public Expression> AutoIncrementField() { return x => x.Number; } public Filter AutoIncrementFilter() { return null; } public static TimeSpan EffectiveTime(TimeSpan actual, TimeSpan booked) => actual.Ticks != 0L ? actual : booked; public TimeSpan EffectiveStartTime() { return EffectiveTime(Actual.Start, Booked.Start); } public DateTime EffectiveStart() { return Date.Add(EffectiveStartTime()); } public TimeSpan EffectiveFinishTime() { // If we have an actual finish, always use that // otherwise use EffectiveStart() + booked.duration return EffectiveTime( Actual.Finish, EffectiveTime(Actual.Start, Booked.Start) .Add(Booked.Duration) ); } public DateTime EffectiveFinish() { return Date.Add( EffectiveFinishTime() ); } static EquipmentAssignment() { //LinkedProperties.Register(ass => ass.Equi.Charge, chg => chg.Chargeable, ass => ass.Charge.Chargeable); Classes.JobScope.LinkScopeProperties(); } } }