| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 | using System;using System.ComponentModel;using System.Linq.Expressions;using AutoProperties;using InABox.Core;namespace Comal.Classes{    public interface IJob : IEntity    {        public string JobNumber { get; set; }    }    [UserTracking("Project Management")]    public class Job : Entity, IJob, IPersistent, IRemotable, IScheduleAction, IOneToMany<Schedule>, IStringAutoIncrement<Job>,        ILicense<ProjectManagementLicense>, 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)]        [RequiredColumn]        public CustomerLink Customer { get; set; }                [EditorSequence(5)]        [AddressEditor(true)]        public Address SiteAddress { get; set; }                [EditorSequence(6)]        public ContactLink Contact { get; set; }                [EditorSequence(7)]        [TextBoxEditor]        public String ClientReference { get; set; }                [EditorSequence(8)]        public JobStatusLink JobStatus { get; set; }        #endregion                #region Accounts                [EditorSequence("Accounts",1)]        [Caption("Bill To")]        [RequiredColumn]        public AccountLink Account { get; set; }        [EditorSequence("Accounts",2)]        public JobRetention Retention { get; set; }                #endregion        [NotesEditor]        [EditorSequence(NotesPage, 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; }                [EditorSequence("Other", 4)]        [TextBoxEditor]        public string SourceRef { 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; }                [DurationEditor]        [EditorSequence("Project Management", 6)]        public TimeSpan AllowableOvertime { get; set; }                // This is the Activity to which the Usual Start/Finish Applies        // Other activitiy timesheets are not affected by this        [EditorSequence("Project Management", 7)]        public ActivityLink UsualActivity { get; set; }        [EditorSequence("Project Management", 8)]        public DateTime ExpectedCompletionDate { get; set; }        [EditorSequence("Project Management", 8)]        public DateTime Completed { get; set; }                private class JobScopeLookup : LookupDefinitionGenerator<JobScope, Job>        {            public override Filter<JobScope> DefineFilter(Job[] items)            {                var item = items?.Length == 1 ? items[0] : null;                if (item != null)                    return new Filter<JobScope>(x => x.Job.ID).IsEqualTo(item.ID).And(x => x.Status.Approved).IsEqualTo(true);                return new Filter<JobScope>(x => x.ID).None();            }                        public override Columns<Job> DefineFilterColumns()                => Columns.None<Job>().Add(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]        [InterceptIgnore]        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}";        public int AutoIncrementDefault() => 1;                [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);            LinkedProperties.Register<Job, AccountLink, Guid>(x => x.Customer.Account, x => x.ID, x => x.Account.ID);            DefaultColumns.Add<Job>(x => x.JobNumber, width: 50, caption: "Job #");            DefaultColumns.Add<Job>(x => x.Name);        }    }}
 |