Files
BeWoPlaner/ReportImp/VkmAachenSbd/CustomReportCreator.cs
2022-03-09 16:52:32 +01:00

524 lines
19 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BeWo.Service.ServiceImplementations;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using DevExpress.XtraReports.UI;
namespace VkmAachenSbd
{
public class CustomReportCreator : DefaultReportCreator
{
public override XtraReport CreateQueryReport(long queryOid, string queryReportId)
{
if (queryOid == 200)
{
return CreateLeistungsnachweisAbrechnung(queryOid, queryReportId);
}
if (queryOid == 500 || queryOid == 600)
{
return CreateMitarbeiterSpitzabrechnung(queryOid, queryReportId);
}
return base.CreateQueryReport(queryOid, queryReportId);
}
private XtraReport CreateMitarbeiterSpitzabrechnung(long queryOid, string queryReportId)
{
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
if (query == null)
return new XtraReport();
var path = Path.Combine(TempPath, queryReportId + ".xml");
var table = Utils.XMLDeserialize<DataTable>(path);
var qro = QueryRO.Create(query, table);
if (qro.Rows.Count > 0)
{
var vs = PluginLoader.FindClass<VacationService>();
List<long> empOids = new List<long>();
if (qro.Rows[0].Field3.ToString() != "0")
{
var empOid = Int64.Parse(qro.Rows[0].Field3.ToString());
empOids.Add(empOid);
}
else
{
var allemps = DAOFactory.GenericDAO.GetAllActive<Employee>();
empOids.AddRange(allemps.Select(e => e.Oid.Value));
}
DateTime start = DateTime.Parse(qro.Rows[0].Field1.ToString());
DateTime end = DateTime.Parse(qro.Rows[0].Field2.ToString()).AddTicks(-1);
if (start == DateTime.MinValue)
{
//Setze Default Start
if (queryOid == 500)
{
//Anfang Vormonat
start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-1);
}
else
{
//1.8. des Vorjahres/aktuellen Jahres
start = new DateTime(DateTime.Now.Year, 8, 1);
if (start.AddMonths(1) > DateTime.Now)
{
start = start.AddYears(-1);
}
}
}
if (end.Year == 9999)
{
//Setze Default Start
if (queryOid == 500)
{
//Ende Vormonat
end = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddTicks(-1);
}
else
{
end = start.AddYears(1).AddTicks(-1);
}
}
if (start > end)
{
start = end;
}
// DateTime start = DateTime.MinValue;
//DateTime end = DateTime.MaxValue;
//if (queryOid == 500)
//{
// start = DateTime.Parse(qro.Rows[0].Field1.ToString());
// end = start.AddMonths(1).AddTicks(-1);
//}
//else
//{
// start = DateTime.Parse(qro.Rows[0].Field1.ToString());
// end = start.AddYears(1).AddTicks(-1);
// }
var roList = new List<MitarbeiterSpitzabrechnungMonatRO>();
foreach (var empOid in empOids)
{
IList<ServiceRecord> recordsAll = DAOFactory.SearchDAO.FindServiceRecords(empOid, null);
recordsAll = AnalysisServiceImp.FilterActiveServiceRecords(recordsAll);
IList<ServiceRecord> groupFilteredRecords = new List<ServiceRecord>();
Dictionary<long, bool> groupBookingDict = new Dictionary<long, bool>();
foreach (var item in recordsAll)
{
if (item.Start >= start && item.Start <= end)
{
if (!item.GroupOid.HasValue || !groupBookingDict.ContainsKey(item.GroupOid.Value))
{
groupFilteredRecords.Add(item);
if (item.GroupOid.HasValue)
{
groupBookingDict.Add(item.GroupOid.Value, true);
}
}
}
}
if (groupFilteredRecords.Count > 0)
{
var ro = new MitarbeiterSpitzabrechnungMonatRO();
ro.StartDate = start;
ro.EndDate = end;
var emp = DAOFactory.GenericDAO.LoadByID<Employee>(empOid);
ro.Employee = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(emp);
ro.ServiceRecords = new List<ServiceRecordListRO.ServiceRecordDetail>();
foreach (var item in groupFilteredRecords.OrderBy(s => s.Start))
{
var sd = new ServiceRecordListRO.ServiceRecordDetail();
sd.Start = item.Start;
sd.End = item.End;
sd.ServiceDescription = item.ServiceDescription.Name;
sd.ServiceCategory = item.ServiceDescription.ServiceCategory.Name;
sd.RoundedDuration = (item.GroupOid.HasValue
? item.GroupRoundedDuration.Value
: item.RoundedDuration) / 60;
sd.Notice = item.ServiceDescription.ServiceCategory.Name;
ro.ServiceRecords.Add(sd);
}
CreateAdditionalServiceRecords(vs, ro, emp, start, end);
roList.Add(ro);
}
}
if (queryOid == 500)
{
XtraReport allReports = null;
foreach (var ro in roList.OrderBy(r => r.Employee.LastName))
{
ro.ServiceRecords = ro.ServiceRecords.OrderBy(s => s.Start).ToList();
var singleReport = new MitarbeiterSpitzabrechnungMonat();
singleReport.SetReportDataSource(ro);
singleReport.CreateDocument();
if (allReports == null)
allReports = singleReport;
else
allReports.Pages.AddRange(singleReport.Pages);
}
if (allReports == null)
{
allReports = new XtraReport();
}
return allReports;
}
else
{
var jahresReport = new MitarbeiterSpitzabrechnungJahr();
jahresReport.SetReportDataSource(CreateJahresRO(roList, start, end));
return jahresReport;
}
}
return new XtraReport();
}
private MitarbeiterSpitzabrechnungJahrRO CreateJahresRO(List<MitarbeiterSpitzabrechnungMonatRO> roList, DateTime start, DateTime end)
{
var jahresRo = new MitarbeiterSpitzabrechnungJahrRO();
jahresRo.StartDate = start;
jahresRo.EndDate = end;
jahresRo.Details = new List<MitarbeiterSpitzabrechnungMitarbeiterJahrRO>();
foreach (var ro in roList.OrderBy(r => r.Employee.LastName))
{
var mro = new MitarbeiterSpitzabrechnungMitarbeiterJahrRO();
jahresRo.Details.Add(mro);
mro.Employee = ro.Employee;
foreach (var srd in ro.ServiceRecords)
{
if (LiegtImGleichenMonat(srd, start))
{
mro.StundenJan += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(1)))
{
mro.StundenFeb += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(2)))
{
mro.StundenMar += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(3)))
{
mro.StundenApr += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(4)))
{
mro.StundenMai += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(5)))
{
mro.StundenJun += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(6)))
{
mro.StundenJul += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(7)))
{
mro.StundenAug += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(8)))
{
mro.StundenSep += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(9)))
{
mro.StundenOkt += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(10)))
{
mro.StundenNov += srd.RoundedDuration;
}
else if (LiegtImGleichenMonat(srd, start.AddMonths(11)))
{
mro.StundenDez += srd.RoundedDuration;
}
}
}
return jahresRo;
}
private bool LiegtImGleichenMonat(ServiceRecordListRO.ServiceRecordDetail srd, DateTime start)
{
if (srd.Start.Value.Month == start.Month && srd.Start.Value.Year == start.Year)
{
return true;
}
return false;
}
private void CreateAdditionalServiceRecords(VacationService vs, MitarbeiterSpitzabrechnungMonatRO ro, Employee emp, DateTime start, DateTime end)
{
Dictionary<string, bool> urlaubDict = new Dictionary<string, bool>();
DateTime dt = start;
while (dt < end)
{
var contract = emp.GetValidContractForDate(dt);
if (contract != null)
{
String key = String.Format("{0:MMyyyy}", dt);
if (!urlaubDict.ContainsKey(key))
{
CreateUrlaubsPauschale(ro, contract, dt, end);
urlaubDict.Add(key, true);
}
if (dt.DayOfWeek != DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday && vs.IstFeiertag(dt))
{
CreateFeiertagsPauschale(ro, contract, dt);
}
}
dt = dt.AddDays(1);
}
}
private void CreateUrlaubsPauschale(MitarbeiterSpitzabrechnungMonatRO ro, Contract contract, DateTime dt, DateTime gesamtEnde)
{
if (contract.WeeklyTotalHours.HasValue)
{
decimal wochentage = 5;
if (contract.WeeklyDays.HasValue && contract.WeeklyDays.Value > 0)
{
wochentage = contract.WeeklyDays.Value;
}
var sollProTag = contract.WeeklyTotalHours.Value / wochentage;
decimal factor = 2.5m;
DateTime end = new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);
if (gesamtEnde < end)
{
end = gesamtEnde;
}
if (contract.ContractEndDate.HasValue && contract.ContractEndDate < end)
{
end = contract.ContractEndDate.Value;
}
if (end < new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1) || dt.Day > 1)
{
//kein ganzer Monat, berechne Factor neu
int days = (int)end.Subtract(dt).TotalDays + 1;
if (days < 15)
{
factor = 1;
}
else
{
factor = 2;
}
}
var sd = new ServiceRecordListRO.ServiceRecordDetail();
sd.Start = dt;
sd.End = dt;
sd.RoundedDuration = sollProTag * factor;
sd.Notice = String.Format("Zeitsoll {0:0.00} Wo.std, {1:0.0} Url.tage", contract.WeeklyTotalHours, factor);
ro.ServiceRecords.Add(sd);
}
}
private void CreateFeiertagsPauschale(MitarbeiterSpitzabrechnungMonatRO ro, Contract contract, DateTime dt)
{
if (contract.WeeklyTotalHours.HasValue)
{
decimal wochentage = 5;
if (contract.WeeklyDays.HasValue && contract.WeeklyDays.Value > 0)
{
wochentage = contract.WeeklyDays.Value;
}
var sd = new ServiceRecordListRO.ServiceRecordDetail();
sd.Start = dt;
sd.End = dt;
sd.RoundedDuration = contract.WeeklyTotalHours.Value / wochentage;
sd.Notice = "Ist-Buchung für Feiertag";
ro.ServiceRecords.Add(sd);
}
}
private XtraReport CreateLeistungsnachweisAbrechnung(long queryOid, string queryReportId)
{
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
if (query == null)
return new XtraReport();
var path = Path.Combine(TempPath, queryReportId + ".xml");
var table = Utils.XMLDeserialize<DataTable>(path);
var qro = QueryRO.Create(query, table);
if (qro.Rows.Count > 0)
{
long? c2s = null;
if (qro.Rows[0].Field2.ToString() != "0")
{
c2s = Int64.Parse(qro.Rows[0].Field2.ToString());
}
DateTime monat = DateTime.Parse(qro.Rows[0].Field1.ToString());
var services = DAOFactory.SearchDAO.GetServiceInvoices(c2s, new DateTimeSpan { StartDateTime = monat, EndDateTime = monat.AddMonths(1).AddDays(-1) });
IBeWoReport<ServiceInvoiceRO> allReports = null;
var dcList = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDCs(services);
foreach (var iDC in dcList)
{
IBeWoReport<ServiceInvoiceRO> singleReport = new LeistungsnachweisAbrechnung();
singleReport.SetReportDataSource(ServiceInvoiceRO.Create(iDC));
((XtraReport)singleReport).CreateDocument();
if (allReports == null)
allReports = singleReport;
else
((XtraReport)allReports).Pages.AddRange(((XtraReport)singleReport).Pages);
}
if (allReports != null)
{
return allReports as XtraReport;
}
}
return new XtraReport();
}
public override XtraReport CreateSbdLeistungsnachweisForSingleCustomerReport(long customerOid, int month, int year, long orgaOid, long empOid, long serviceCategoryOid, int startDay, int endDay, bool checkServiceRecords, string bundesland)
{
return CreateReportForStundenaufstellungROs(CreateStundenaufstellungROs(customerOid, month, year, orgaOid, empOid, serviceCategoryOid, startDay, endDay));
//var report = this.FindReportImp<SbdStundenaufstellungRO>();
//report.SetReportDataSource(SbdStundenaufstellungRO.Create(customerOid, month, year, orgaOid, empOid, serviceCategoryOid, startDay, endDay));
//return report as XtraReport;
}
public static List<SbdStundenaufstellungRO> CreateStundenaufstellungROs(long pCustomerOid, int pMonth, int pYear, long orgaOid, long empOid, long serviceCategoryOid, int start, int end, bool disableEmptySupportConcepts = false)
{
var pSpan = new DateTimeSpan();
if (start > end)
{
int temp = start;
start = end;
end = temp;
}
pSpan.StartDateTime = new DateTime(pYear, pMonth, start);
pSpan.EndDateTime = pSpan.StartDateTime.AddDays(end - start + 1).AddTicks(-1);
var resultList = new List<SbdStundenaufstellungRO>();
Customer c = null;
if (pCustomerOid > 0)
{
c = DAOFactory.GenericDAO.LoadByID<Customer>(pCustomerOid);
resultList.AddRange(SbdStundenaufstellungRO.Create(c, pSpan, orgaOid, empOid, serviceCategoryOid, disableEmptySupportConcepts, false, "nrw"));
}
else if (empOid > 0)
{
var emp = DAOFactory.GenericDAO.LoadByID<Employee>(empOid);
foreach (var e2c in emp.Employee2CustomerList)
{
foreach (var v2o in e2c.ValueList)
{
if (v2o.Entry != null && v2o.Entry.Type == ValueListEntryType.StaffRoleType && !v2o.Entry.Value.ToLower().Contains("ehemalig") && e2c.Customer.IsActive == ActivationTypeId.Active)
{
resultList.AddRange(SbdStundenaufstellungRO.Create(e2c.Customer, pSpan, orgaOid, empOid, serviceCategoryOid, disableEmptySupportConcepts, false, "nrw"));
}
}
}
}
return resultList;
}
private XtraReport CreateReportForStundenaufstellungROs(IList<SbdStundenaufstellungRO> ros)
{
if (ros.Count > 0)
{
var lServiceOverviewAllCustomersReport = this.FindReportImp<SbdStundenaufstellungRO>();
lServiceOverviewAllCustomersReport.SetReportDataSource(ros[0]);
(lServiceOverviewAllCustomersReport as XtraReport).CreateDocument();
var Report = lServiceOverviewAllCustomersReport as XtraReport;
for (int i = 1; i < ros.Count; i++)
{
var lNext = FindReportImp<SbdStundenaufstellungRO>();
lNext.SetReportDataSource(ros[i]);
(lNext as XtraReport).CreateDocument();
Report.Pages.AddRange((lNext as XtraReport).Pages);
}
return lServiceOverviewAllCustomersReport as XtraReport;
}
return new XtraReport();
}
}
}