using System; using System.Collections.Generic; using System.Linq; using System.Windows.Media.Imaging; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; namespace PRSDesktop { public class TimeSheetLeaveRequestGrid : DynamicDataGrid { public DateTime From { get; set; } public DateTime To { get; set; } public TimeSheetLeaveRequestGrid() : base() { ColumnsTag = "TimeSheetLeaveRequest"; Options .BeginUpdate() .Clear() .Add(DynamicGridOption.SelectColumns) .EndUpdate(); ActionColumns.Add(new DynamicImageColumn(SelectedImage, SelectedAction)); HiddenColumns.Add(x => x.EmployeeLink.ID); HiddenColumns.Add(x => x.LeaveType.ID); HiddenColumns.Add(x => x.From); HiddenColumns.Add(x => x.FromTime); HiddenColumns.Add(x => x.To); HiddenColumns.Add(x => x.ToTime); HiddenColumns.Add(x => x.Notes); } protected override void GenerateColumns(DynamicGridColumns columns) { columns.Add(x => x.EmployeeLink.Name, 0, "Employee", "", Alignment.MiddleLeft); columns.Add(x => x.LeaveType.Description, 200, "Type", "", Alignment.MiddleCenter); columns.Add(x => x.From, 80, "", "dd MMM yy", Alignment.MiddleCenter); columns.Add(x => x.To, 80, "", "dd MMM yy", Alignment.MiddleCenter); } private BitmapImage tick = PRSDesktop.Resources.tick.AsBitmapImage(); private List selectedrows = new List(); private bool SelectedAction(CoreRow? arg) { if (arg == null) { foreach (var row in Data.Rows) ToggleRow(row); } else ToggleRow(arg); return false; } private void ToggleRow(CoreRow row) { Guid id = row.Get(x => x.ID); if (selectedrows.Contains(id)) selectedrows.Remove(id); else selectedrows.Add(id); InvalidateRow(row); } private BitmapImage? SelectedImage(CoreRow? arg) { return arg == null ? tick : selectedrows.Contains(arg.Get(x=>x.ID)) ? tick : null; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder? sort, Action action) { criteria.Add(new InABox.Core.Filter(x => x.From).IsLessThanOrEqualTo(To) .And(x => x.To).IsGreaterThanOrEqualTo(From) .And(x=>x.Status).IsEqualTo(LeaveRequestStatus.Approved) .And(x =>x.Processed).IsEqualTo(DateTime.MinValue)); base.Reload(criteria, columns, ref sort, action); } public void Process(IProgress progress) { if (!selectedrows.Any()) return; var employeeids = Data.ToDictionary(x => x.ID, x => x.EmployeeLink.ID) .Where(x=>selectedrows.Contains(x.Key)) .Select(x=>x.Value) .Distinct() .ToArray(); progress.Report("Loading Leave Requests"); var employees = new Client().Query( new Filter(x=>x.ID).InList(employeeids), new Columns(x => x.ID) .Add(x=>x.Name) .Add(x=>x.Roster) .Add(x=>x.RosterStart) .Add(x => x.StartDate) .Add(x => x.FinishDate) ).Rows.Select(x=>x.ToObject()).ToArray(); var rosters = employees.ToDictionary(x => x.ID, x => x.Roster); int i = 0; List leaves = new List(); foreach (var row in Data.Rows) { if (selectedrows.Contains(row.Get(x => x.ID))) { var leave = row.ToObject(); var employee = employees.FirstOrDefault(x => x.ID == leave.EmployeeLink.ID); if (employee != null) { var roster = !String.IsNullOrWhiteSpace(rosters[employee.ID]) ? Serialization.Deserialize>(rosters[employee.ID])?.OrderBy(x => x.Day).ToArray() : null; progress.Report($"Processing Leave Request {((double)i * 100.0F / (double)selectedrows.Count):F2}"); var timesheets = RosterUtils.CreateLeaveTimesheets( employee, roster, leave.From, leave.FromTime, leave.To, leave.ToTime, leave.LeaveType.ID, (timesheet) => { timesheet.Notes = leave.Notes; timesheet.LeaveRequestLink.ID = leave.ID; } ); new Client().Save(timesheets, "Updated from TimeSheet leave Processor"); } i++; leave.Processed = DateTime.Now; leaves.Add(leave); } } if (leaves.Any()) { progress.Report("Saving Leave Requests"); new Client().Save(leaves, "Updated from TimeSheet leave Processor"); } } } }