Files
BeWoPlaner/Report/ReportObjects/EmployeeKilometerauswertungsListRO.cs
2024-05-24 11:40:53 +02:00

105 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BS.Shared.Core;
using BS.Shared.DataContracts.Compact;
namespace BeWo.Report.ReportObjects
{
public class EmployeeKilometerauswertungsListRO : AbstractBeWoReportObject<EmployeeKilometerauswertungsListRO>
{
public List<CompactEmployeeDC> AllEmployees { get; set; }
// Alt
public DateTime MonthInformation { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public List<long> LeistungenOids { get; set; }
public List<Employee2EmployeeKilometerauswertungsEntry> Employees2Entries { get; set; } = new List<Employee2EmployeeKilometerauswertungsEntry>();
public static EmployeeKilometerauswertungsListRO Create(List<CompactEmployeeDC> employees, List<long> leistungenOids, DateTime start, DateTime end)
{
var employeeKilometerauswertungsListRO = new EmployeeKilometerauswertungsListRO
{
AllEmployees = employees,
MonthInformation = start,
LeistungenOids = leistungenOids,
StartDate = start,
EndDate = end
};
employeeKilometerauswertungsListRO.CreateEntries();
employeeKilometerauswertungsListRO.Employees2Entries.Sort((e1, e2) => e1.EmployeeName.CompareTo(e2.EmployeeName));
return employeeKilometerauswertungsListRO;
}
public void CreateEntries()
{
var start = StartDate;
var end = EndDate.AddDays(1).AddTicks(-1);
var timeSpan = new DateTimeSpan();
timeSpan.StartDateTime = start;
timeSpan.EndDateTime = end;
var rawData = DAOFactory.SearchDAO.FindListOfEmployeeServiceRecordsForKilometerauswertung(AllEmployees.Select(employee => employee.EmployeeOid).ToList(), LeistungenOids, timeSpan);
foreach(var employeeOid2ServiceRecords in rawData)
{
var employee = AllEmployees.FirstOrDefault(e => e.EmployeeOid == employeeOid2ServiceRecords.Key);
if(employee != null)
{
var employee2KilometerauswertungsEntry = new Employee2EmployeeKilometerauswertungsEntry(employee, employeeOid2ServiceRecords.Value.OrderBy(serviceRecord => serviceRecord.Start));
Employees2Entries.Add(employee2KilometerauswertungsEntry);
}
}
}
}
public class Employee2EmployeeKilometerauswertungsEntry
{
public CompactEmployeeDC Employee { get; set; }
public string EmployeeName => Employee?.ToString();
public List<EmployeeKilometerauswertungsEntry> Entries { get; set; }
public double TotalDistanceInMeters { get; set; }
public Employee2EmployeeKilometerauswertungsEntry(CompactEmployeeDC employee, IEnumerable<ServiceRecord> serviceRecords)
{
Employee = employee;
Entries = new List<EmployeeKilometerauswertungsEntry>();
TotalDistanceInMeters = 0;
foreach(var serviceRecord in serviceRecords.Where(serviceRecord => serviceRecord.DistanceInMeter.HasValue && serviceRecord.Start.HasValue))
{
var distance = (serviceRecord.GroupPersonCount == null) ? (double)serviceRecord.DistanceInMeter.Value : (double)serviceRecord.DistanceInMeter.Value / (double)serviceRecord.GroupPersonCount;
var distanceRounded = Math.Round(distance, 2);
TotalDistanceInMeters += distanceRounded;
var e = new EmployeeKilometerauswertungsEntry(serviceRecord.Start, serviceRecord.End, distanceRounded, serviceRecord.Customer?.Person?.LastNameFirstName ?? string.Empty, serviceRecord.Notice, serviceRecord);
e.Notice = serviceRecord.Notice;
e.Notice2 = serviceRecord.Notice2;
e.Notice3 = serviceRecord.Notice3;
e.Notice4 = serviceRecord.Notice4;
e.Notice5 = serviceRecord.Notice5;
Entries.Add(e);
}
Entries = Entries.OrderBy(o => o.Datum).ToList();
}
}
}