This commit is contained in:
Lyndon Jetten
2020-08-31 18:01:59 +02:00
parent ef016941f5
commit 2f84b9962d
2 changed files with 372 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
using BeWo.Service.Plugins;
using BS.Shared.DataContracts;
namespace demo_reports.Export
{
public class CustomDataExporter : DataExporter
{
public override string CreateExportString(string pFileID, string[] pHeaderCaption, string[][] pContent)
{
// TODO: anpassen -> Contains("Qlik")
//if(pHeaderCaption != null && pHeaderCaption.Length > 0 && pHeaderCaption[0].Contains("FibuNet"))
//{
// return QlikCsvExporter.CreateExportString(pHeaderCaption, pContent);
//}
return base.CreateExportString(pFileID, pHeaderCaption, pContent);
}
public override QueryDC CreateQuery(QueryDC query)
{
return QlikCsvExporter.CreateQuery(query);
}
}
}

View File

@@ -0,0 +1,348 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using CsvHelper;
namespace demo_reports.Export
{
public class QlikCsvExporter
{
public static QueryDC CreateQuery(QueryDC query)
{
if(query != null)
{
var dateTimeSpan = new DateTimeSpan(new DateTime(1900, 1, 1), DateTime.Today);
if(query.Parameter.Any() && query.Parameter[0].Value is DateTimeSpan span)
{
dateTimeSpan = span;
}
switch(query.Title)
{
case "Qlik-Report Mitarbeiter":
query.QueryResult = GetEmployeeCSV(dateTimeSpan);
break;
case "Qlik-Report Klienten":
query.QueryResult = GetCustomerCSV();
break;
case "Qlik-Report Teams":
query.QueryResult = CreateTeamsCSV();
break;
case "Qlik-Report Team-Mitarbeiter-Relationen":
query.QueryResult = CreateTeamEmployeeRelationCSV();
break;
case "Qlik-Report Zeiterfassung":
query.QueryResult = GetServiceRecordCSV(dateTimeSpan);
break;
case "Qlik-Report Budgetausschöpfung":
query.QueryResult = GetBudgetCSV();
break;
case "Qlik-Report Mitarbeiterabwesenheiten":
query.QueryResult = GetEmployeeAbsenceTimes(dateTimeSpan);
break;
case "Qlik-Report Mitarbeiterqualifikationen":
query.QueryResult = GetEmployeeeQualifications();
break;
}
query.FileName = $"{query.Title}.csv";
}
return query;
}
private static string CreateTeamEmployeeRelationCSV()
{
var resultList = new List<object>();
var teams = DAOFactory.GenericDAO.GetAllActive<Team>();
teams.DoForEach(team => {
team.MemberList.DoForEach(member =>
{
resultList.Add(new
{
TeamId = team.Oid,
MitarbeiterId = member.Oid,
IstLeitung = team.Leader.Equals(member)
});
});
});
return CreateCsvString(resultList);
}
private static string CreateTeamsCSV()
{
var resultList = new List<object>();
var teams = DAOFactory.GenericDAO.GetAllActive<Team>();
teams.DoForEach(team => {
resultList.Add(new
{
TeamId = team.Oid,
Teamname = team.Name,
});
});
return CreateCsvString(resultList);
}
private static string GetEmployeeeQualifications()
{
var resultList = new List<object>();
var employees = DAOFactory.GenericDAO.GetAllActive<Employee>();
employees.DoForEach(employee =>
{
employee.ValueList.Where(w => w.Entry.Type.Equals(ValueListEntryType.StaffQualificationsType)).DoForEach(valueListEntry2Object =>
{
resultList.Add(new
{
MitarbeiterId = employee.Oid,
Qualifikation = valueListEntry2Object.Entry.Value
});
});
});
return CreateCsvString(resultList);
}
private static string GetEmployeeAbsenceTimes(DateTimeSpan dateTimeSpan)
{
var resultList = new List<object>();
var absenceTimes = DAOFactory.SearchDAO.FindAbsenceTimes(dateTimeSpan.StartDate, dateTimeSpan.EndDate).Where(absenceTime => absenceTime.AbsenceReason.Description.ToLower().Contains("krank"));
absenceTimes.DoForEach(absenceTime =>
{
if(absenceTime.EmployeeOid.HasValue)
{
resultList.Add(new
{
MitarbeiterId = absenceTime.EmployeeOid,
Beginn = $"{absenceTime.Start:yyyy-MM-dd}",
Ende = $"{absenceTime.End:yyyy-MM-dd}",
Abwesenheitskategorie = absenceTime.AbsenceReason.Description
});
}
});
return CreateCsvString(resultList);
}
private static string GetEmployeeCSV(DateTimeSpan dateTimeSpan)
{
var resultList = new List<object>();
var employee2Teams = new Dictionary<long, List<Team>>();
var teams = DAOFactory.GenericDAO.GetAllActive<Team>();
var mitarbeiterstundenkontoBerechnung = new MitarbeiterstundenkontoBerechnung();
var employees = DAOFactory.GenericDAO.GetAllActive<Employee>();
employees.DoForEach(employee =>
{
teams.DoForEach(team =>
{
if(team.MemberList.Contains(employee) && employee.Oid.HasValue)
{
employee2Teams.AddOrUpdateValueInDictionary(employee.Oid.Value, new List<Team> { team });
}
});
});
var employeeOids = employees.Where(employee => employee.Oid.HasValue).Select(employee => employee.Oid.Value).ToList();
employees.DoForEach(employee =>
{
try
{
var teamOids = teams.Where(w => w.Leader.Oid == employee.Oid || w.MemberList.Any(a => a.Oid == employee.Oid)).ToList().Select(s => s.Oid.Value).ToList();
var flsIstSum = 0m;
var flsSollSum = 0m;
var gesamtIstSum = 0m;
var stundenSollSum = 0m;
var counter = 0;
var start = dateTimeSpan.StartDate;
var end = dateTimeSpan.EndDate;
var currentDate = start.GetFirstOfMonth();
while(currentDate <= end)
{
var reportObject = MitarbeiterstundenkontoRO.Create(employee.Oid, teamOids, currentDate, currentDate.AddMonths(1), employeeOids);
mitarbeiterstundenkontoBerechnung.CreateReport(reportObject);
var employeeDetail = reportObject.EmployeeDetailList.FirstOrDefault(empDetail => empDetail.Employee.Equals(employee));
if(employeeDetail != null)
{
flsIstSum += employeeDetail.FlsIst;
flsSollSum += employeeDetail.FlsSoll;
gesamtIstSum += employeeDetail.StundenGesamtIst;
stundenSollSum += employeeDetail.StundenSollMax;
}
counter++;
currentDate = currentDate.AddMonths(1);
}
var flsIst = flsIstSum / counter;
var flsSoll = flsSollSum / counter;
var gesamtIst = gesamtIstSum / counter;
var stundenSoll = stundenSollSum / counter;
resultList.Add(new
{
MitarbeiterId = employee.Oid,
Nachname = employee.Person.LastName,
Vorname = employee.Person.FirstName,
FLSIst = flsIst,
FLSSoll = flsSoll,
GesamtIst = gesamtIst,
StundenSoll = stundenSoll,
IstFachkraft = employee.IsQualified ?? false
});
}
catch(Exception exception)
{
Console.WriteLine(exception);
throw;
}
});
var stringWriter = new StringWriter();
using(var csv = new CsvWriter(stringWriter, CultureInfo.InvariantCulture))
{
csv.WriteRecords(resultList);
}
return stringWriter.ToString();
}
private static string GetCustomerCSV()
{
var customers = DAOFactory.GenericDAO.GetAllActive<Customer>();
var resultList = new List<object>();
customers.DoForEach(customer =>
{
resultList.Add(new
{
KlientenId = customer.Oid,
Nachname = customer.Person.LastName,
Vorname = customer.Person.FirstName
});
});
return CreateCsvString(resultList);
}
private static string GetServiceRecordCSV(DateTimeSpan dateTimeSpan)
{
var serviceRecords = DAOFactory.SearchDAO.FindServiceRecordsInSpan(dateTimeSpan, null);
var resultList = new List<object>();
serviceRecords.DoForEach(serviceRecord =>
{
resultList.Add(
new
{
MitarbeiterId = serviceRecord.EmployeeOid,
KlientenId = serviceRecord.CustomerOid,
ZeiterfassungseintragId = serviceRecord.Oid,
Beginn = $"{serviceRecord.Start:yyyy-MM-dd HH:mm}",
Ende = $"{serviceRecord.End:yyyy-MM-dd HH:mm}",
GerundeteDauer = serviceRecord.RoundedDuration,
GerundeteGruppendauer = serviceRecord.GroupRoundedDuration,
GruppenId = serviceRecord.GroupOid,
Kategorie = serviceRecord.ServiceDescription.Name,
KostentraegerZuHilfeplanId = serviceRecord.CostBearer2SupportConceptOid
});
});
return CreateCsvString(resultList);
}
private static string GetBudgetCSV()
{
var resultList = new List<object>();
// KostentraegerZuHilfeplanId (zum Verknüpfen mit der Zeiterfassung), KlientenId, Von, Bis FLSSoll, FLSIst (kann man mit den ServiceRecords berechnen), Intervall, IstAbgeschlossen (archiviert oder in der Vergangenheit)
var costBearer2SupportConcepts = DAOFactory.GenericDAO.GetAll<CostBearer2SupportConcept>();
costBearer2SupportConcepts.DoForEach(cb2Sc =>
{
var approvedSpan = cb2Sc.GetApprovedSpan();
if(approvedSpan != null)
{
var istAbgeschlossen = approvedSpan.EndDate < DateTime.Now || cb2Sc.IsActive != ActivationTypeId.Active;
cb2Sc.ApprovalPeriodList.DoForEach(period =>
{
var start = period.StartDate;
var end = period.EndDate;
var customerId = cb2Sc.SupportConcept.Customer.Oid;
var interval = period.ApprovedBEInterval != null ? EnumTranslations.SupportConceptApprovalInterval2Translations[(SupportConceptApprovalInterval) period.ApprovedBEInterval] : null;
var total = period.ApprovedBETotal;
var perInterval = period.ApprovedBEPerInterval;
resultList.Add(new
{
KostentraegerZuHilfeplanId = cb2Sc.Oid,
KlientenId = customerId,
Beginn = $"{start:yyyy-MM-dd}",
Ende = $"{end:yyyy-MM-dd}",
Intervall = interval,
FLSGesamt = total,
FLSProIntervall = perInterval ?? 0,
IstAbgeschlossen = istAbgeschlossen
});
});
}
});
return CreateCsvString(resultList);
}
private static string CreateCsvString(List<object> dataList)
{
if(dataList == null)
{
return null;
}
var stringWriter = new StringWriter();
using(var csv = new CsvWriter(stringWriter, CultureInfo.InvariantCulture))
{
csv.WriteRecords(dataList);
}
return stringWriter.ToString();
}
}
}