.
This commit is contained in:
24
ReportImp/demo_reports/Export/CustomDataExporter.cs
Normal file
24
ReportImp/demo_reports/Export/CustomDataExporter.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
348
ReportImp/demo_reports/Export/QlikCsvExporter.cs
Normal file
348
ReportImp/demo_reports/Export/QlikCsvExporter.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user