| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 | 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<Schedule>, IStringAutoIncrement<Job>,        ILicense<ProjectManagementLicense>, IExportable, IImportable, IMergeable, IDataEntryInstance    {        #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; }        [SecondaryIndex]        [EnumLookupEditor(typeof(JobType))]        [EditorSequence(2)]        public JobType JobType { get; set; } = JobType.Project;        [EditorSequence(3)]        public CustomerLink Customer { get; set; }                [EditorSequence(4)]        public Address SiteAddress { get; set; }                [EditorSequence(5)]        public ContactLink Contact { get; set; }                [EditorSequence(6)]        [Caption("Bill To")]        public AccountLink Account { get; set; }        #endregion        [NotesEditor]        [EditorSequence("Notes", 1)]        public string[] Notes { get; set; } = Array.Empty<string>();        #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; }        //[SecondaryIndex]        //[EditorSequence(9)]        //public Boolean Active { get; set; }        [EditorSequence("Project Management", 9)]        public JobStatusLink JobStatus { get; set; }                [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<Func<Job, string>> AutoIncrementField() => x => x.JobNumber;        public Filter<Job>? 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<Job, ContactLink, Guid>(x => x.Customer.DefaultContact, x => x.ID, x => x.Contact.ID);            LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.Street, x=>x.SiteAddress.Street);            LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.City, x=>x.SiteAddress.City);            LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.PostCode, x=>x.SiteAddress.PostCode);            LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.State, x=>x.SiteAddress.State);            LinkedProperties.Register<Job,Address,String>(x=>x.Customer.Delivery, x=>x.Location.Address, x=>x.SiteAddress.Location.Address);            LinkedProperties.Register<Job,Address,double>(x=>x.Customer.Delivery, x=>x.Location.Latitude, x=>x.SiteAddress.Location.Latitude);            LinkedProperties.Register<Job,Address,double>(x=>x.Customer.Delivery, x=>x.Location.Longitude, x=>x.SiteAddress.Location.Longitude);            LinkedProperties.Register<Job,Address,DateTime>(x=>x.Customer.Delivery, x=>x.Location.Timestamp, x=>x.SiteAddress.Location.Timestamp);        }    }}
 |