| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 | using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Linq.Expressions;using InABox.Clients;using InABox.Core;namespace Comal.Classes{        [Caption("Digital Forms")]    [UserTracking("Digital Forms")]    public class DeliveryForm : EntityForm<Delivery, DeliveryLink, DeliveryForm>, IDigitalForm<Delivery>    {        public override string AutoIncrementPrefix() => "DF";    }        public class DeliveryDocumentCount : CoreAggregate<Delivery, DeliveryDocument, Guid>    {        public override Expression<Func<DeliveryDocument, Guid>> Aggregate => x => x.ID;        public override AggregateCalculation Calculation => AggregateCalculation.Count;        public override Dictionary<Expression<Func<DeliveryDocument, object>>, Expression<Func<Delivery, object>>> Links =>            new Dictionary<Expression<Func<DeliveryDocument, object>>, Expression<Func<Delivery, object>>>()            {                { DeliveryDocument => DeliveryDocument.EntityLink.ID, Delivery => Delivery.ID }            };    }    [UserTracking("Logistics")]    [Caption("Deliveries")]    public class Delivery : Entity, IPersistent, IRemotable, INumericAutoIncrement<Delivery>, IOneToMany<Assignment>, ILicense<LogisticsLicense>,        IExportable, IImportable    {        [EditorSequence(1)]        [IntegerEditor]        public int Number { get; set; }        [EditorSequence(2)]        public DeliveryTypeLink Type { get; set; }        [EditorSequence(3)]        public JobLink Job { get; set; }                [EditorSequence(4)]        public Address Address { get; set; }        [EditorSequence(5)]        public ContactLink Contact { get; set; }                [EditorSequence(6)]        [MemoEditor]        public string Notes { get; set; }        [EntityRelationship(DeleteAction.SetNull)]        [EditorSequence(7)]        public AssignmentLink Assignment { get; set; }        [EditorSequence(8)]        public EmployeeLink Employee { get; set; }        [DateTimeEditor]        [EditorSequence(9)]        public DateTime Due { get; set; }        [Aggregate(typeof(DeliveryDocumentCount))]        [IntegerEditor(Editable = Editable.Hidden)]        public int Documents { get; set; }        [TimestampEditor]        [EditorSequence(10)]        public DateTime Delivered { get; set; }        [EditorSequence(11)]        public EmployeeLink DeliveredBy { get; set; }        [NullEditor]        public Location Location { get; set; }        [TimestampEditor(Editable = Editable.Disabled)]        [EditorSequence(12)]        public DateTime Completed { get; set; }        [NullEditor]        public int KanbanNumber { get; set; } = 0;        public Expression<Func<Delivery, int>> AutoIncrementField()        {            return x => x.Number;        }        public Filter<Delivery> AutoIncrementFilter()        {            return null;        }        //this only refers to a kanban generated by the deliveries mobile app - not a kanban which may have generated the delivery        protected override void Init()        {            base.Init();            Job.PropertyChanged += Job_PropertyChanged;            Contact.PropertyChanged += Contact_PropertyChanged;        }        private void Contact_PropertyChanged(object sender, PropertyChangedEventArgs e)        {            if (string.Equals(e.PropertyName, "ID"))            {                var contactLink = (sender as ContactLink)!;                CoreTable results = null;                if (contactLink.IsValid())                    results = new Client<Contact>().Query(                        new Filter<Contact>(x => x.ID).IsEqualTo(contactLink.ID),                        new Columns<Contact>(                            x => x.Address.Street,                            x => x.Address.City,                            x => x.Address.State,                            x => x.Address.PostCode                        )                    );                var row = results?.Rows.FirstOrDefault();                Address.Street = row != null ? row.Get<Contact, string>(x => x.Address.Street) : "";                Address.City = row != null ? row.Get<Contact, string>(x => x.Address.City) : "";                Address.State = row != null ? row.Get<Contact, string>(x => x.Address.State) : "";                Address.PostCode = row != null ? row.Get<Contact, string>(x => x.Address.PostCode) : "";            }        }        private void Job_PropertyChanged(object sender, PropertyChangedEventArgs e)        {            //if (string.Equals(e.PropertyName, "ID") && !Contact.IsValid())            //{            //    var jobLink = sender as JobLink;            //    CoreTable results = null;            //    if (jobLink.IsValid())            //        results = new Client<Job>().Query(            //            new Filter<Job>(x => x.ID).IsEqualTo(jobLink.ID),            //            new Columns<Job>(            //                x => x.SiteAddress.Street,            //                x => x.SiteAddress.City,            //                x => x.SiteAddress.State,            //                x => x.SiteAddress.PostCode            //            )            //        );            //    var row = results?.Rows.FirstOrDefault();            //    Address.Street = row != null ? row.Get<Job, string>(x => x.SiteAddress.Street) : "";            //    Address.City = row != null ? row.Get<Job, string>(x => x.SiteAddress.City) : "";            //    Address.State = row != null ? row.Get<Job, string>(x => x.SiteAddress.State) : "";            //    Address.PostCode = row != null ? row.Get<Job, string>(x => x.SiteAddress.PostCode) : "";            //}        }                static Delivery()        {                        LinkedProperties.Register<Delivery,ContactLink,Guid>(x=>x.Job.Contact, x=>x.ID, x=>x.Contact.ID);                        LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.Street, x=>x.Address.Street);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.City, x=>x.Address.City);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.PostCode, x=>x.Address.PostCode);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.State, x=>x.Address.State);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Job.SiteAddress, x=>x.Location.Address, x=>x.Address.Location.Address);            LinkedProperties.Register<Delivery,Address,double>(x=>x.Job.SiteAddress, x=>x.Location.Latitude, x=>x.Address.Location.Latitude);            LinkedProperties.Register<Delivery,Address,double>(x=>x.Job.SiteAddress, x=>x.Location.Longitude, x=>x.Address.Location.Longitude);            LinkedProperties.Register<Delivery,Address,DateTime>(x=>x.Job.SiteAddress, x=>x.Location.Timestamp, x=>x.Address.Location.Timestamp);                        LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.Street, x=>x.Address.Street);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.City, x=>x.Address.City);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.PostCode, x=>x.Address.PostCode);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.State, x=>x.Address.State);            LinkedProperties.Register<Delivery,Address,String>(x=>x.Contact.Address, x=>x.Location.Address, x=>x.Address.Location.Address);            LinkedProperties.Register<Delivery,Address,double>(x=>x.Contact.Address, x=>x.Location.Latitude, x=>x.Address.Location.Latitude);            LinkedProperties.Register<Delivery,Address,double>(x=>x.Contact.Address, x=>x.Location.Longitude, x=>x.Address.Location.Longitude);            LinkedProperties.Register<Delivery,Address,DateTime>(x=>x.Contact.Address, x=>x.Location.Timestamp, x=>x.Address.Location.Timestamp);        }        #region Move to Assignments?        [NullEditor]        public DateTime Date { get; set; }        [NullEditor]        public TimeSpan Start { get; set; }        [NullEditor]        public TimeSpan Finish { get; set; }        private bool bChanging;        protected override void DoPropertyChanged(string name, object? before, object? after)        {            base.DoPropertyChanged(name, before, after);            if (bChanging)                return;            bChanging = true;            if (name.Equals("Start"))                Finish = ((TimeSpan)after).Add(Duration);            else if (name.Equals("Finish"))                Duration = ((TimeSpan)after).Subtract(Start);            else if (name.Equals("Duration")) Finish = Start.Add((TimeSpan)after);            bChanging = false;        }        [NullEditor]        public TimeSpan Duration { get; set; }        #endregion    }}
 |