Files
BeWoPlaner/Report/ReportObjects/KilometerauswertungsListRO.cs

130 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
namespace BeWo.Report.ReportObjects
{
public class KilometerauswertungsListRO : AbstractBeWoReportObject<KilometerauswertungsListRO>
{
public List<CompactCustomerDC> AllCustomers { 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<Customer2KilometerauswertungsEntry> Customer2Entries { get; set; } = new List<Customer2KilometerauswertungsEntry>();
public static KilometerauswertungsListRO Create(List<CompactCustomerDC> customers, List<long> leistungenOids, DateTime start, DateTime end)
{
var kilometerauswertungsListRO = new KilometerauswertungsListRO
{
AllCustomers = customers,
MonthInformation = start,
LeistungenOids = leistungenOids,
StartDate = start,
EndDate = end
};
kilometerauswertungsListRO.CreateEntries();
return kilometerauswertungsListRO;
}
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.FindListOfCustomerServiceRecordsForKilometerauswertung(AllCustomers.Select(customer => customer.CustomerOid).ToList(), LeistungenOids, timeSpan);
foreach(var customerOid2Servicerecords in rawData)
{
var customer = AllCustomers.FirstOrDefault(c => c.CustomerOid == customerOid2Servicerecords.Key);
if(customer != null)
{
var customer2KilometerauswertungsEntry = new Customer2KilometerauswertungsEntry(customer, customerOid2Servicerecords.Value.OrderBy(serviceRecord => serviceRecord.Start));
Customer2Entries.Add(customer2KilometerauswertungsEntry);
}
}
}
}
public class Customer2KilometerauswertungsEntry
{
public CompactCustomerDC Customer { get; set; }
public string CustomerName => Customer?.ToString();
public List<KilometerauswertungsEntry> Entries { get; set; }
public double TotalDistanceInMeters { get; set; }
public double TotalKilometerPauschale { get; set; }
public String TotalCustom1 { get; set; }
public Customer2KilometerauswertungsEntry(CompactCustomerDC customer, IEnumerable<ServiceRecord> serviceRecords)
{
Customer = customer;
Entries = new List<KilometerauswertungsEntry>();
TotalDistanceInMeters = 0;
TotalKilometerPauschale = 0;
var preise = DAOFactory.GenericDAO.GetAllActive<Preis>();
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 pauschVar = GetPreis(preise, "Kilometerpauschale", serviceRecord.Start.Value);
var e = new KilometerauswertungsEntry(serviceRecord.Start, serviceRecord.End, distanceRounded, serviceRecord.Employee.Person.LastNameFirstName);
e.KilometerPauschale = Math.Round(distanceRounded * (double)pauschVar, 2, MidpointRounding.AwayFromZero);
e.Notice = serviceRecord.Notice;
e.Notice2 = serviceRecord.Notice2;
e.Notice3 = serviceRecord.Notice3;
e.Notice4 = serviceRecord.Notice4;
e.Notice5 = serviceRecord.Notice5;
TotalKilometerPauschale += e.KilometerPauschale;
Entries.Add(e);
}
Entries = Entries.OrderBy(o => o.Datum).ToList();
}
private static decimal GetPreis(IList<Preis> allePreise, String name, DateTime datum)
{
var pausch = allePreise.Where(p => p.Name.Contains(name)).FirstOrDefault();
if (pausch != null)
{
var crlist = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(pausch.CostRatePeriods);
var cr = crlist.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, datum);
if (cr != null && cr.CostRateValue.HasValue)
{
return cr.CostRateValue.Value;
}
}
return 0;
}
}
}