diff --git a/ReportImp/demo_reports/Export/CustomDataExporter.cs b/ReportImp/demo_reports/Export/CustomDataExporter.cs new file mode 100644 index 000000000..b461f22eb --- /dev/null +++ b/ReportImp/demo_reports/Export/CustomDataExporter.cs @@ -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); + } + } +} diff --git a/ReportImp/demo_reports/Export/QlikCsvExporter.cs b/ReportImp/demo_reports/Export/QlikCsvExporter.cs new file mode 100644 index 000000000..95b935c95 --- /dev/null +++ b/ReportImp/demo_reports/Export/QlikCsvExporter.cs @@ -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(); + + var teams = DAOFactory.GenericDAO.GetAllActive(); + + 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(); + + var teams = DAOFactory.GenericDAO.GetAllActive(); + + teams.DoForEach(team => { + resultList.Add(new + { + TeamId = team.Oid, + Teamname = team.Name, + }); + }); + + return CreateCsvString(resultList); + } + + private static string GetEmployeeeQualifications() + { + var resultList = new List(); + + var employees = DAOFactory.GenericDAO.GetAllActive(); + + 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(); + + 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(); + + var employee2Teams = new Dictionary>(); + + var teams = DAOFactory.GenericDAO.GetAllActive(); + + var mitarbeiterstundenkontoBerechnung = new MitarbeiterstundenkontoBerechnung(); + + var employees = DAOFactory.GenericDAO.GetAllActive(); + + employees.DoForEach(employee => + { + teams.DoForEach(team => + { + if(team.MemberList.Contains(employee) && employee.Oid.HasValue) + { + employee2Teams.AddOrUpdateValueInDictionary(employee.Oid.Value, new List { 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(); + + var resultList = new List(); + + 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(); + + 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(); + // 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(); + + 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 dataList) + { + if(dataList == null) + { + return null; + } + + var stringWriter = new StringWriter(); + + using(var csv = new CsvWriter(stringWriter, CultureInfo.InvariantCulture)) + { + csv.WriteRecords(dataList); + } + + return stringWriter.ToString(); + } + } +}