Files
BeWoPlaner/Report/ReportObjects/FLSReportRO.cs
Christian 6c92c8eacc cb
2019-08-29 15:43:23 +02:00

506 lines
18 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.DataContracts;
using BS.Shared.Extensions;
namespace BeWo.Report.ReportObjects
{
public class FLSReportRO : AbstractBeWoReportObject<FLSReportRO>
{
private List<FLSReportGroup> _FLSReportGroups = new List<FLSReportGroup>();
public List<FLSReportGroup> FLSReportGroups
{
get
{
return this._FLSReportGroups;
}
set
{
this._FLSReportGroups = value;
}
}
public string GroupTypeHeader { get; set; }
public DateTime? ReportEndDate { get; set; }
public DateTime? ReportStartDate { get; set; }
public DateTime? SupportConceptEndDate { get; set; }
public DateTime? SupportConceptStartDate { get; set; }
public decimal TotalFLM { get; set; }
public string TotalHourMinuteString { get; set; }
public static FLSReportRO Create(FLSAnalysisDataReportDC dc)
{
var result = new FLSReportRO();
long starttime = DateTime.Now.Ticks;
result.ReportStartDate = dc.ReportStartDate;
result.ReportEndDate = dc.ReportEndDate;
result.TotalFLM = dc.TotalFLM;
int h = (int)Math.Floor(result.TotalFLM / 60);
int m = (int)result.TotalFLM % 60;
result.TotalHourMinuteString = String.Format("{0}:{1:00}", h, m);
if (dc.ReportType == 0)
{
result.GroupTypeHeader = "Klient/in";
}
else if (dc.ReportType == 1)
{
result.GroupTypeHeader = "Mitarbeiter/in";
}
else if (dc.ReportType == 2)
{
result.GroupTypeHeader = "Kostenträger";
}
foreach (var group in dc.Groups)
{
FLSReportGroup reportGroup = new FLSReportGroup();
reportGroup.TotalFLM = group.TotalFLM;
h = (int)Math.Floor(reportGroup.TotalFLM / 60);
m = (int)reportGroup.TotalFLM % 60;
reportGroup.TotalHourMinuteString = String.Format("{0}:{1:00}", h, m);
reportGroup.Name = group.Name;
reportGroup.CustomValue1 = group.CustomField1;
reportGroup.CustomValue2 = group.CustomField2;
reportGroup.CustomValue3 = group.CustomField3;
reportGroup.CustomValue4 = group.CustomField4;
reportGroup.CustomValue5 = group.CustomField5;
Contract lastContract = null;
Employee emp = null;
if (group.Oid != null)
{
reportGroup.ObjectOid = group.Oid.Value;
Person p = null;
if (dc.ReportType == 0)
{
emp = DAOFactory.GenericDAO.LoadByID<Employee>(group.Oid.Value);
if (emp != null)
{
lastContract = emp.GetValidContractForDate(dc.ReportEndDate);
p = emp.Person;
reportGroup.MaxPayment = Decimal.MaxValue;
}
}
else if (dc.ReportType == 1)
{
Customer cust = DAOFactory.GenericDAO.LoadByID<Customer>(group.Oid.Value);
if (cust != null)
{
p = cust.Person;
}
}
if (p != null)
{
reportGroup.PersonSalutation = p.Sex == Sex.Female
? "Frau"
: "Herr";
reportGroup.PersonFirstName = p.FirstName;
reportGroup.PersonLastName = p.LastName;
if (p.Address != null)
{
reportGroup.PersonStreet = p.Address.Street;
reportGroup.PersonPostalCode = p.Address.PostalCode;
reportGroup.PersonCity = p.Address.Town;
}
}
}
if (lastContract != null)
{
reportGroup.EmployeeHourlyRate = lastContract.HourlyRate;
reportGroup.EmployeeWeeklyFLS = lastContract.WeeklyFLS;
}
if (emp != null)
{
decimal maxpayment = 0;
Contract cstart = emp.GetValidContractForDate(dc.ReportStartDate);
Contract cend = emp.GetValidContractForDate(dc.ReportEndDate);
if (cstart != null && cstart.HourlyRate.HasValue && cstart.WeeklyTotalHours.HasValue && cend != null)
{
if (cstart.Oid.Value == cend.Oid.Value || !cend.EntryDate.HasValue)
{
maxpayment = cstart.HourlyRate.Value * cstart.WeeklyTotalHours.Value * 4;
}
else
{
decimal totalHoursPerDay = cstart.WeeklyTotalHours.Value / 7m;
DateTime end = cend.EntryDate.Value;
TimeSpan ts = end.Subtract(dc.ReportStartDate.Value);
int days = (int)ts.TotalDays;
maxpayment = totalHoursPerDay * cstart.HourlyRate.Value * days;
Contract c2 = emp.GetValidContractForDate(end.AddDays(1));
if (c2 != null && c2.HourlyRate.HasValue && c2.WeeklyTotalHours.HasValue)
{
decimal totalHoursPerDay2 = c2.WeeklyTotalHours.Value / 7m;
TimeSpan ts2 = dc.ReportEndDate.Value.Subtract(end);
int days2 = (int)ts2.TotalDays + 1;
maxpayment += totalHoursPerDay2 * c2.HourlyRate.Value * days2;
}
}
}
if (lastContract != null)
{
if (lastContract.WeeklyTotalHours != null)
{
reportGroup.EmployeePrePayment = reportGroup.EmployeeHourlyRate * lastContract.WeeklyTotalHours * 4;
}
}
reportGroup.EmployeePrePayment = maxpayment;
}
decimal gesamtBetrag = 0;
foreach (var detail in group.Details)
{
FLSReportDetail reportDetail = new FLSReportDetail();
reportDetail.Name = detail.Name;
reportDetail.CustomValue1 = detail.CustomValue1;
reportDetail.CustomValue2 = detail.CustomValue2;
reportDetail.CustomValue3 = detail.CustomValue3;
decimal flm = 0;
foreach (var sr in detail.ServiceRecords)
{
FLSReportServiceRecord reportSR = new FLSReportServiceRecord();
reportSR.EmployeeOid = sr.EmployeeOid;
reportSR.CustomerOid = sr.CustomerOid;
reportSR.CostBearer2SupportConceptOid = sr.CostBearer2SupportConceptOid;
reportSR.Start = sr.Start;
reportSR.End = sr.End;
if (sr.Start != null && sr.Start.Value.Second == 0)
{
reportSR.StartTime = sr.Start;
DateTime endDt = sr.Start.Value.AddMinutes((double)sr.RoundedDuration);
if (sr.GroupOid.HasValue && sr.GroupRoundedDuration.HasValue)
endDt = sr.Start.Value.AddMinutes((double)sr.GroupRoundedDuration);
reportSR.EndTime = endDt;
reportSR.TimeRange = String.Format("{0:HH:mm} - {1:HH:mm}", reportSR.Start, endDt);
}
reportSR.InsertedOn = sr.InsertedOn;
reportSR.InsUser = sr.InsUser;
reportSR.ServiceRecordOid = sr.ServiceRecordOid;
reportSR.DistanceInMeter = sr.DistanceInMeter;
reportSR.Notice = sr.Notice;
reportSR.Notice2 = sr.Notice2;
reportSR.Notice3 = sr.Notice3;
reportSR.Notice4 = sr.Notice4;
reportSR.Notice5 = sr.Notice5;
reportSR.RoundedDuration = sr.RoundedDuration;
flm += sr.RoundedDuration;
if (emp != null)
{
Contract con = emp.GetValidContractForDate(sr.Start);
if (con != null && con.HourlyRate.HasValue)
{
gesamtBetrag += con.HourlyRate.Value * (sr.RoundedDuration / 60);
}
}
if (reportSR.Start != null && reportSR.End != null)
{
TimeSpan ts = reportSR.End.Value.Subtract(reportSR.Start.Value);
reportSR.Duration = ts.GetTotalMinutes();
}
if (sr.ServiceDescription != null)
{
reportSR.ServiceDescription = sr.ServiceDescription.Name;
reportSR.ServiceCategory = sr.ServiceDescription.CategoryName;
reportSR.ServiceDescriptionAbbr = sr.ServiceDescription.Abbreviation;
reportSR.ServiceCategoryAbbr = sr.ServiceDescription.Category.Abbreviation;
}
if (sr.GroupOid != null && sr.GroupPersonCount != null)
{
reportSR.GroupName = "Gruppe (" + sr.GroupPersonCount.Value + " Teilnehmer)";
}
else
{
reportSR.GroupName = sr.GroupName;
reportSR.GroupName = "Sonstiges".Equals(sr.GroupName)
? string.Empty
: sr.GroupName;
}
if (dc.ShowGroups)
{
reportDetail.ServiceRecords.Add(reportSR);
}
else
{
reportGroup.ServiceRecords.Add(reportSR);
}
}
reportDetail.TotalFLM = flm;
h = (int)Math.Floor(reportDetail.TotalFLM / 60);
m = (int)reportDetail.TotalFLM % 60;
reportDetail.TotalHourMinuteString = String.Format("{0}:{1:00}", h, m);
if (dc.ShowGroups)
{
reportGroup.FLSReportDetails.Add(reportDetail);
}
}
//reportGroup.EmployeePayment = reportGroup.EmployeeHourlyRate * (reportGroup.TotalFLM / 60);
reportGroup.EmployeePayment = gesamtBetrag;
if (lastContract != null && lastContract.EmploymentType != null && reportGroup.EmployeePayment != null && reportGroup.EmployeePayment.Value > 0)
{
reportGroup.EmploymentTypeOid = lastContract.EmploymentType.Oid;
}
result.FLSReportGroups.Add(reportGroup);
}
long endtime = DateTime.Now.Ticks;
long diff = endtime - starttime;
double secs = diff / (double)10000000;
return result;
}
public class FLSReportDetail
{
private List<FLSReportServiceRecord> _ServiceRecords = new List<FLSReportServiceRecord>();
public string Name { get; set; }
public List<FLSReportServiceRecord> ServiceRecords
{
get
{
return this._ServiceRecords;
}
set
{
this._ServiceRecords = value;
}
}
public decimal TotalFLM { get; set; }
public string TotalHourMinuteString { get; set; }
public long ObjectOid { get; set; }
public String CustomValue1 { get; set; }
public String CustomValue2 { get; set; }
public String CustomValue3 { get; set; }
}
public class FLSReportGroup
{
private List<FLSReportDetail> _FLSReportDetails = new List<FLSReportDetail>();
private List<FLSReportServiceRecord> _ServiceRecords = new List<FLSReportServiceRecord>();
public decimal? EmployeeHourlyRate { get; set; }
public decimal? EmployeePayment { get; set; }
public decimal? EmployeePrePayment { get; set; }
public decimal? EmployeeWeeklyFLS { get; set; }
public long? EmploymentTypeOid { get; set; }
public List<FLSReportDetail> FLSReportDetails
{
get
{
return this._FLSReportDetails;
}
set
{
this._FLSReportDetails = value;
}
}
public decimal MaxPayment { get; set; }
public string Name { get; set; }
public string PersonCity { get; set; }
public string PersonFirstName { get; set; }
public string PersonLastName { get; set; }
public string PersonPostalCode { get; set; }
public string PersonSalutation { get; set; }
public string PersonStreet { get; set; }
public List<FLSReportServiceRecord> ServiceRecords
{
get
{
return this._ServiceRecords;
}
set
{
this._ServiceRecords = value;
}
}
public decimal TotalFLM { get; set; }
public string TotalHourMinuteString { get; set; }
public long ObjectOid { get; set; }
public String CustomValue1 { get; set; }
public String CustomValue2 { get; set; }
public String CustomValue3 { get; set; }
public String CustomValue4 { get; set; }
public String CustomValue5 { get; set; }
}
public class FLSReportServiceRecord
{
public decimal Duration { get; set; }
public DateTime? End { get; set; }
public DateTime? EndTime { get; set; }
public string[] Goals { get; set; }
public string GoalString { get; set; }
public string GroupName { get; set; }
public string InsUser { get; set; }
public DateTime? InsertedOn { get; set; }
public string Notice { get; set; }
public string Notice2 { get; set; }
public string Notice3 { get; set; }
public string Notice4 { get; set; }
public string Notice5 { get; set; }
public decimal RoundedDuration { get; set; }
public string ServiceCategory { get; set; }
public string ServiceDescription { get; set; }
public string ServiceCategoryAbbr { get; set; }
public string ServiceDescriptionAbbr { get; set; }
public DateTime? Start { get; set; }
public DateTime? StartTime { get; set; }
public string TimeRange { get; set; }
public long? CustomerOid { get; set; }
public long? EmployeeOid { get; set; }
public long? CostBearer2SupportConceptOid { get; set; }
public String CustomValue1 { get; set; }
public String CustomValue2 { get; set; }
public String CustomValue3 { get; set; }
public String CustomValue4 { get; set; }
public String CustomValue5 { get; set; }
public int? DistanceInMeter { get; set; }
public long? ServiceRecordOid { get; set; }
}
public static void CreateGoalList(FLSReportServiceRecord sr)
{
if (sr.ServiceRecordOid.HasValue)
{
var srBO = DAOFactory.GenericDAO.LoadByID<ServiceRecord>(sr.ServiceRecordOid.Value);
var dc = MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDC(srBO);
if (dc.Goals != null && dc.Goals.Count > 0)
{
sr.GoalString = "";
foreach (var goal in dc.Goals)
{
if (sr.GoalString.Length > 0)
sr.GoalString += ", ";
sr.GoalString += goal.TypeDescription;
}
}
}
}
}
}