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, IDigitalForm { public override string AutoIncrementPrefix() => "DF"; } public class DeliveryDocumentCount : CoreAggregate { public override Expression> Aggregate => x => x.ID; public override AggregateCalculation Calculation => AggregateCalculation.Count; public override Dictionary>, Expression>> Links => new Dictionary>, Expression>>() { { DeliveryDocument => DeliveryDocument.EntityLink.ID, Delivery => Delivery.ID } }; } [UserTracking("Logistics")] [Caption("Deliveries")] public class Delivery : Entity, IPersistent, IRemotable, INumericAutoIncrement, IOneToMany, ILicense, 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> AutoIncrementField() { return x => x.Number; } public Filter 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().Query( new Filter(x => x.ID).IsEqualTo(contactLink.ID), new Columns( 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(x => x.Address.Street) : ""; Address.City = row != null ? row.Get(x => x.Address.City) : ""; Address.State = row != null ? row.Get(x => x.Address.State) : ""; Address.PostCode = row != null ? row.Get(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().Query( // new Filter(x => x.ID).IsEqualTo(jobLink.ID), // new Columns( // 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(x => x.SiteAddress.Street) : ""; // Address.City = row != null ? row.Get(x => x.SiteAddress.City) : ""; // Address.State = row != null ? row.Get(x => x.SiteAddress.State) : ""; // Address.PostCode = row != null ? row.Get(x => x.SiteAddress.PostCode) : ""; //} } static Delivery() { LinkedProperties.Register(x=>x.Job.Contact, x=>x.ID, x=>x.Contact.ID); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.Street, x=>x.Address.Street); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.City, x=>x.Address.City); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.PostCode, x=>x.Address.PostCode); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.State, x=>x.Address.State); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.Location.Address, x=>x.Address.Location.Address); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.Location.Latitude, x=>x.Address.Location.Latitude); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.Location.Longitude, x=>x.Address.Location.Longitude); LinkedProperties.Register(x=>x.Job.SiteAddress, x=>x.Location.Timestamp, x=>x.Address.Location.Timestamp); LinkedProperties.Register(x=>x.Contact.Address, x=>x.Street, x=>x.Address.Street); LinkedProperties.Register(x=>x.Contact.Address, x=>x.City, x=>x.Address.City); LinkedProperties.Register(x=>x.Contact.Address, x=>x.PostCode, x=>x.Address.PostCode); LinkedProperties.Register(x=>x.Contact.Address, x=>x.State, x=>x.Address.State); LinkedProperties.Register(x=>x.Contact.Address, x=>x.Location.Address, x=>x.Address.Location.Address); LinkedProperties.Register(x=>x.Contact.Address, x=>x.Location.Latitude, x=>x.Address.Location.Latitude); LinkedProperties.Register(x=>x.Contact.Address, x=>x.Location.Longitude, x=>x.Address.Location.Longitude); LinkedProperties.Register(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 } }