123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading;
- using System.Windows.Media.Imaging;
- using Comal.Classes;
- using InABox.Clients;
- using InABox.Core;
- using InABox.DynamicGrid;
- using InABox.WPF;
- using PRS.Shared;
- namespace PRSDesktop
- {
- public class TimeSheetLeaveRequestGrid : DynamicDataGrid<LeaveRequest>
- {
- public DateTime From { get; set; }
- public DateTime To { get; set; }
-
- public TimeSheetLeaveRequestGrid() : base()
- {
- ColumnsTag = "TimeSheetLeaveRequest";
-
- 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 DoReconfigure(DynamicGridOptions options)
- {
- base.DoReconfigure(options);
- options.Clear();
- options.SelectColumns = true;
- }
- public override DynamicGridColumns GenerateColumns()
- {
- var columns = new DynamicGridColumns();
- columns.Add<LeaveRequest>(x => x.EmployeeLink.Name, 0, "Employee", "", Alignment.MiddleLeft);
- columns.Add<LeaveRequest>(x => x.LeaveType.Description, 200, "Type", "", Alignment.MiddleCenter);
- columns.Add<LeaveRequest>(x => x.From, 80, "", "dd MMM yy", Alignment.MiddleCenter);
- columns.Add<LeaveRequest>(x => x.To, 80, "", "dd MMM yy", Alignment.MiddleCenter);
- return columns;
- }
- private BitmapImage tick = PRSDesktop.Resources.tick.AsBitmapImage();
- public HashSet<Guid> SelectedIDs = new HashSet<Guid>();
- 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<LeaveRequest, Guid>(x => x.ID);
- if (!SelectedIDs.Add(id))
- {
- SelectedIDs.Remove(id);
- }
- InvalidateRow(row);
- }
- private BitmapImage? SelectedImage(CoreRow? arg)
- {
- return arg == null
- ? tick
- : SelectedIDs.Contains(arg.Get<LeaveRequest,Guid>(x=>x.ID))
- ? tick
- : null;
- }
- protected override void Reload(
- Filters<LeaveRequest> criteria, Columns<LeaveRequest> columns, ref SortOrder<LeaveRequest>? sort,
- CancellationToken token, Action<CoreTable?, Exception?> action)
- {
- criteria.Add(new InABox.Core.Filter<LeaveRequest>(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, token, action);
- }
- public void Process(IProgress<String> progress)
- {
- if (SelectedIDs.Count == 0)
- return;
- var employeeids = Data.ToDictionary<LeaveRequest, Guid, Guid>(x => x.ID, x => x.EmployeeLink.ID)
- .Where(x => SelectedIDs.Contains(x.Key))
- .Select(x=>x.Value)
- .Distinct()
- .ToArray();
- progress.Report("Loading Leave Requests");
- var employees = new Client<Employee>().Query(
- new Filter<Employee>(x=>x.ID).InList(employeeids),
- Columns.None<Employee>().Add(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<Employee>()).ToArray();
- var rosters = employees.ToDictionary<Employee, Guid, String>(x => x.ID, x => x.Roster);
- int i = 0;
- List<LeaveRequest> leaves = new List<LeaveRequest>();
- foreach (var row in Data.Rows)
- {
- if (SelectedIDs.Contains(row.Get<LeaveRequest, Guid>(x => x.ID)))
- {
- var leave = row.ToObject<LeaveRequest>();
- var employee = employees.FirstOrDefault(x => x.ID == leave.EmployeeLink.ID);
- if (employee != null)
- {
- var roster = !String.IsNullOrWhiteSpace(rosters[employee.ID])
- ? Serialization.Deserialize<List<EmployeeRosterItem>>(rosters[employee.ID])?.OrderBy(x => x.Day).ToArray()
- : null;
- progress.Report($"Processing Leave Request {((double)i * 100.0F / (double)SelectedIDs.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<TimeSheet>().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<LeaveRequest>().Save(leaves, "Updated from TimeSheet leave Processor");
- }
- }
-
- }
- }
|