using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using Comal.Classes; using comal.timesheets; using InABox.Core; using Syncfusion.Drawing; using Syncfusion.Pdf; using Xamarin.Forms.Internals; namespace comal.timesheets { public class AssignmentFormInstance : INotifyPropertyChanged { private Guid _id = Guid.Empty; public Guid ID { get => _id; set => SetField(ref _id, value); } private String _description = ""; public String Description { get => _description; set => SetField(ref _description, value); } private bool _completed = false; public bool Completed { get => _completed; set => SetField(ref _completed, value); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } } public class AssignmentEditDataModel : SingleDataModel { public Guid JobID { get; set; } public Guid EmployeeID { get; set; } public List> Activities { get; private set; } public List Forms { get; private set; } public PointF Coordinates { get; set; } public override Columns Columns => new Columns(x => x.ID) .Add(x=>x.Number) .Add(x => x.Title) .Add(x => x.Description) .Add(x => x.Date) .Add(x => x.Actual.Start) .Add(x => x.Actual.Duration) .Add(x => x.Actual.Finish) .Add(x => x.Booked.Start) .Add(x => x.Booked.Duration) .Add(x => x.Booked.Finish) .Add(c => c.JobLink.ID) .Add(c => c.JobLink.JobNumber) .Add(c => c.JobLink.Name) .Add(c => c.ActivityLink.ID) .Add(c => c.ActivityLink.Code) .Add(c => c.ActivityLink.Description) .Add(c => c.EmployeeLink.ID) .Add(c => c.ActivityLink.Color) .Add(c => c.Task.ID) .Add(c => c.Task.Number) .Add(c => c.Task.Title) .Add(c => c.Completed); public override void BeforeLoad(MultiQuery query, Guid id) { base.BeforeLoad(query, id); query.Add( new Filter(x => x.ID).IsEqualTo(EmployeeID), new Columns(x=>x.Activity.ID).Add(x=>x.Activity.Code).Add(x=>x.Activity.Description) ); if (JobID != Guid.Empty) { query.Add( new Filter(x => x.ID).IsEqualTo(JobID), new Columns(x => x.SiteAddress.Location.Latitude) .Add(x => x.SiteAddress.Location.Longitude) ); } query.Add( new Filter(x => x.Parent.ID).IsEqualTo(id), new Columns(x => x.ID) .Add(x => x.Form.Code) .Add(x => x.Form.Description) .Add(x => x.FormCompleted) ); } public override void AfterLoad(MultiQuery query, Guid id) { base.AfterLoad(query, id); Activities = query.Get().ToDictionary( x => x.Activity.ID, (row) => String.Format("{0}: {1}", row.Get(c => c.Activity.Code), row.Get(c => c.Activity.Description)), x => x.Activity.Code ).ToList(); if (JobID != Guid.Empty) { Coordinates = query.Get().Rows.Select(r => new PointF( (float)r.Get(c => c.SiteAddress.Location.Longitude), (float)r.Get(c => c.SiteAddress.Location.Latitude) )).FirstOrDefault(); } else Coordinates = PointF.Empty; Forms = query.Get() .Rows .Select(row => new AssignmentFormInstance() { ID = row.Get(c=>c.ID), Description = row.Get(c => c.Form.Description), Completed = !row.Get(c=>c.FormCompleted).IsEmpty() }).ToList(); //.ToDictionary( //x => x.ID, //(row) => String.Format("{0}: {1}", row.Get(c => c.Form.Code), // //x => x.Form.Code //).ToList(); } } public class AssignmentEditDataModelItem : SingleDataModelItem { public Guid ID => GetValue(x => x.ID); public Guid EmployeeID { get => GetValue(c => c.EmployeeLink.ID); set => UpdateValue(c => c.EmployeeLink.ID, value); } public int Number { get => GetValue(c => c.Number); set => UpdateValue(c=>c.Number,value); } public String Subject { get => GetValue(c => c.Title); set => UpdateValue(c=>c.Title,value); } public String Description { get => GetValue(c => c.Description); set => UpdateValue(c => c.Description, value); } public DateTime Date { get => GetValue(c => c.Date); set => UpdateValue(c => c.Date, value); } public TimeSpan Start { get { var start = GetValue(c => c.Actual.Start); if (start == TimeSpan.Zero) start = GetValue(c => c.Booked.Start); return start; } set => UpdateValue(c => c.Actual.Start, value); } public TimeSpan Duration { get { var duration = GetValue(c => c.Actual.Duration); if (duration == TimeSpan.Zero) duration = GetValue(c => c.Booked.Duration); return duration; } set => UpdateValue(c => c.Actual.Duration, value); } public TimeSpan Finish { get { var finish = GetValue(c => c.Actual.Finish); if (finish == TimeSpan.Zero) finish = GetValue(c => c.Booked.Finish); return finish; } set => UpdateValue(c => c.Actual.Finish, value); } public Guid JobID { get => GetValue(c => c.JobLink.ID); set => UpdateValue(c => c.JobLink.ID, value); } public String JobNumber { get => GetValue(c => c.JobLink.JobNumber); set { UpdateValue(c => c.JobLink.JobNumber, value, false); DoPropertyChanged(nameof(JobDisplay)); } } public String JobName { get => GetValue(c => c.JobLink.Name); set { UpdateValue(c => c.JobLink.Name, value, false); DoPropertyChanged(nameof(JobDisplay)); } } public String JobDisplay => JobID != Guid.Empty ? String.Format("{0}: {1}", JobNumber, JobName ) : "(No Job Selected)"; public Guid TaskID { get => GetValue(c => c.Task.ID); set => UpdateValue(c => c.Task.ID, value); } public int TaskNumber { get => GetValue(c => c.Task.Number); set { UpdateValue(c => c.Task.Number, value, false); DoPropertyChanged(nameof(TaskDisplay)); } } public String TaskName { get => GetValue(c => c.Task.Title); set { UpdateValue(c => c.Task.Title, value, false); DoPropertyChanged(nameof(TaskDisplay)); } } public String TaskDisplay => TaskID != Guid.Empty ? String.Format("{0}: {1}", TaskNumber, TaskName ) : "(No Task Selected)"; public Guid ActivityID { get => GetValue(c => c.ActivityLink.ID); set => UpdateValue(c => c.ActivityLink.ID, value); } public String ActivityCode { get => GetValue(c => c.ActivityLink.Code); set { UpdateValue(c => c.ActivityLink.Code, value, false); DoPropertyChanged(nameof(ActivityDisplay)); } } public String ActivityDescription { get => GetValue(c => c.ActivityLink.Description); set { UpdateValue(c => c.ActivityLink.Description, value, false); DoPropertyChanged(nameof(ActivityDisplay)); } } public String ActivityColor { get => GetValue(c => c.ActivityLink.Color); set { UpdateValue(c => c.ActivityLink.Color, value, false); DoPropertyChanged(nameof(ActivityColor)); } } public String ActivityDisplay => ActivityID != Guid.Empty ? String.Format("{0}: {1}", ActivityCode, ActivityDescription) : "(No Activity Selected)"; public DateTime Completed { get => GetValue(c => c.Completed); set { UpdateValue(c => c.Completed, value); DoPropertyChanged(nameof(Completed)); } } } }