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();
}
}
}