using System; using System.ComponentModel; using System.Linq.Expressions; using InABox.Core; namespace Comal.Classes { [UserTracking("Project Management")] public class Job : Entity, IPersistent, IRemotable, IScheduleAction, IOneToMany, IStringAutoIncrement, ILicense, IExportable, IImportable, IMergeable, IDataEntryInstance { public const string NotesPage = "Notes"; #region General [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)] [EditorSequence(0)] public string JobNumber { get; set; } //[Obsolete("Replaced by JobNumber", true)] //[IntegerEditor(Editable = Editable.Hidden)] //public int Number { get; set; } [TextBoxEditor] [EditorSequence(1)] public string Name { get; set; } [EditorSequence(2)] [DateEditor] public DateTime Date { get; set; } [SecondaryIndex] [EnumLookupEditor(typeof(JobType))] [EditorSequence(3)] public JobType JobType { get; set; } = JobType.Project; [EditorSequence(4)] public CustomerLink Customer { get; set; } [EditorSequence(5)] public Address SiteAddress { get; set; } [EditorSequence(6)] public ContactLink Contact { get; set; } [EditorSequence(7)] [Caption("Bill To")] public AccountLink Account { get; set; } [EditorSequence(8)] [TextBoxEditor] public String ClientReference { get; set; } [EditorSequence(9)] public JobStatusLink JobStatus { get; set; } #endregion [NotesEditor] [EditorSequence(NotesPage, 1)] public string[] Notes { get; set; } = Array.Empty(); #region Other [TextBoxEditor] [EditorSequence("Other", 1)] public string URL { get; set; } [ColorEditor] [EditorSequence("Other", 2)] public string Color { get; set; } [EditorSequence("Other", 3)] [TimestampEditor] public DateTime DataEntered { get; set; } #endregion #region Project Management [Caption("Project Lead")] [EditorSequence("Project Management", 1)] public EmployeeLink ProjectLead { get; set; } [Caption("Drafting Lead")] [EditorSequence("Project Management", 2)] public EmployeeLink DraftingLead { get; set; } [Caption("Site Lead")] [EditorSequence("Project Management", 3)] public EmployeeLink SiteLead { get; set; } [TextBoxEditor] [EditorSequence("Project Management", 4)] public string SetoutsFolder { get; set; } [TimeOfDayEditor] [EditorSequence("Project Management", 5)] public TimeSpan UsualStart { get; set; } [TimeOfDayEditor] [EditorSequence("Project Management", 5)] public TimeSpan UsualFinish { get; set; } // This is the Activity to which the Usual Start/Finish Applies // Other activitiy timesheets are not affected by this [EditorSequence("Project Management", 6)] public ActivityLink UsualActivity { get; set; } [EditorSequence("Project Management", 7)] public DateTime ExpectedCompletionDate { get; set; } [EditorSequence("Project Management", 8)] public DateTime Completed { get; set; } private class JobScopeLookup : LookupDefinitionGenerator { public override Filter DefineFilter(Job[] items) { var item = items?.Length == 1 ? items[0] : null; if (item != null) return new Filter(x => x.Job.ID).IsEqualTo(item.ID).And(x => x.Status.Approved).IsEqualTo(true); return new Filter(x => x.ID).None(); } public override Columns DefineFilterColumns() => new Columns(x=>x.ID); } [LookupDefinition(typeof(JobScopeLookup))] [EditorSequence("Project Management", 10)] public JobScopeLink DefaultScope { get; set; } #endregion [TimeOfDayEditor(Editable = Editable.Hidden)] public TimeSpan LabourHours { get; set; } [NullEditor] [Obsolete("Why does this even exist?")] public ProductStyleLink Style { get; set; } [NullEditor] [Aggregate(typeof(JobAssignmentCount))] public int Assignments { get; set; } [NullEditor] [Aggregate(typeof(JobOpenAssignmentCount))] public int OpenAssignments { get; set; } [NullEditor] public ScheduleLink ScheduleLink { get; set; } [DoNotPersist] [DoNotSerialize] public static String JobNumberPrefix { get; set; } public Expression> AutoIncrementField() => x => x.JobNumber; public Filter? AutoIncrementFilter() => null; public String AutoIncrementPrefix() => JobNumberPrefix; public string AutoIncrementFormat() => "{0:D4}"; [NullEditor] [Obsolete("Replaced with ProjectLead", true)] public EmployeeLink ManagerLink { get; set; } [NullEditor] [Obsolete("Replaced with SiteLead", true)] public EmployeeLink EmployeeLink { get; set; } protected override void Init() { base.Init(); Customer.Account.PropertyChanged += Account_PropertyChanged; Customer.Delivery.PropertyChanged += Delivery_PropertyChanged; } private void Delivery_PropertyChanged(object sender, PropertyChangedEventArgs e) { var value = CoreUtils.GetPropertyValue(Customer.Delivery, e.PropertyName); CoreUtils.SetPropertyValue(SiteAddress, e.PropertyName, value); } private void Account_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName.Equals("ID")) Account.ID = Customer.Account.ID; else if (e.PropertyName.Equals("Code")) Account.Code = Customer.Account.Code; else if (e.PropertyName.Equals("Name")) Account.Name = Customer.Account.Name; } public override string ToString() { return string.Format("{0}: {1}", JobNumber, Name); } static Job() { LinkedProperties.Register(x => x.Customer.DefaultContact, x => x.ID, x => x.Contact.ID); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.Street, x=>x.SiteAddress.Street); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.City, x=>x.SiteAddress.City); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.PostCode, x=>x.SiteAddress.PostCode); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.State, x=>x.SiteAddress.State); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.Location.Address, x=>x.SiteAddress.Location.Address); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.Location.Latitude, x=>x.SiteAddress.Location.Latitude); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.Location.Longitude, x=>x.SiteAddress.Location.Longitude); LinkedProperties.Register(x=>x.Customer.Delivery, x=>x.Location.Timestamp, x=>x.SiteAddress.Location.Timestamp); } } }