using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.ServiceModel; using BeWo.Data; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Report; using BeWo.Report.DefaultReports; using BeWo.Report.ReportObjects; using BeWo.Service.DCEntityMapper; using BeWo.Service.Plugins; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using DevExpress.XtraPrinting; using DevExpress.XtraReports.UI; using ReportingService.Plugins; using ReportingService.ServiceContracts; namespace ReportingService.ServiceImplementations { [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)] public class ReportServiceImp : IReportService { public MemoryStream CreateKalenderReport(IEnumerable appointmentOids, long? employeeOid, IEnumerable serientermine, IEnumerable selectedDates, IEnumerable mehrtaegigeTermine) { var reportCreator = GetReportCreator() as DefaultReportCreator; var reportTemp = reportCreator?.FindReportImp() ?? new DailyAppointmentReportKalender(); reportTemp.SetReportDataSource(KalenderRO.Create(appointmentOids, employeeOid, serientermine, selectedDates, mehrtaegigeTermine)); return CreateReportStream(reportTemp as XtraReport); } public MemoryStream CreateKalenderReportWithAbsenceTimes(IEnumerable appointmentOids, long? employeeOid, IEnumerable serientermine, IEnumerable selectedDates, IEnumerable mehrtaegigeTermine, List absenceTimeOids) { var reportCreator = GetReportCreator() as DefaultReportCreator; var reportTemp = reportCreator?.FindReportImp() ?? new DailyAppointmentReportKalender(); reportTemp.SetReportDataSource(KalenderRO.CreateWithAbsenceTimes(appointmentOids, employeeOid, serientermine, selectedDates.ToList(), mehrtaegigeTermine, absenceTimeOids)); return CreateReportStream(reportTemp as XtraReport); } public MemoryStream CreateKassenbuchReport(DateTime zeitraum, BargeldkassenDC bargeldkasse, long objectOid, TableID objectTid) { var beguenstigter = LoadToBargeldkasseRelatedObject(objectTid, objectOid); return CreateReportStream(new KassenbuchReport(), KassenbuchRO.Create(zeitraum, bargeldkasse, beguenstigter)); } public MemoryStream CreateKassenbuchReportImZeitraum(DateTime zeitraumStart, DateTime zeitraumEnde, BargeldkassenDC bargeldkasse, long objectOid, TableID objectTid) { var beguenstigter = LoadToBargeldkasseRelatedObject(objectTid, objectOid); var rc = GetReportCreator() as DefaultReportCreator; IBeWoReport reporttemp = rc?.FindReportImp(); if (reporttemp == null) { reporttemp = new KassenbuchReport(); } reporttemp.SetReportDataSource(KassenbuchRO.Create(zeitraumStart, zeitraumEnde, bargeldkasse, beguenstigter)); return CreateReportStream(reporttemp as XtraReport); } public MemoryStream CreateKassenbelegReport(BargeldtransaktionDC transaktion, long objectOid, TableID objectTid) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreateKassenbelegReport(transaktion, objectOid, objectTid)); } public MemoryStream CreateServiceRecordListReport(long employeeOid, long customerOid, long supportConceptOid, long costbearer2SupportConceptOid, bool isLimited, DateTimeSpan limitingDateTimeSpan) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreateServiceRecordListReport(employeeOid, customerOid, supportConceptOid, costbearer2SupportConceptOid, isLimited, limitingDateTimeSpan)); } public Dictionary GetMitarbeiterverfuegbarkeiten(List mitarbeiter, DateTime startDatum, DateTime endDatum) { var herausgefilterteMitarbeiter = DAOFactory.SearchDAO.FilterEmployeesWithAppointments(mitarbeiter.Select(ma => ma.EmployeeOid).ToList(), startDatum, endDatum); mitarbeiter = mitarbeiter.Where(ma => !herausgefilterteMitarbeiter.Contains(ma.EmployeeOid)).ToList(); var berechnungsBeginn = new DateTime(startDatum.Year, startDatum.Month, 1).AddMonths(-1); var berechnungsEnde = new DateTime(startDatum.Year, startDatum.Month, 1); var msb = new MitarbeiterstundenkontoBerechnung(); var reportObject = MitarbeiterstundenkontoRO.Create(null, null, berechnungsBeginn, berechnungsEnde, mitarbeiter.Select(ma => ma.EmployeeOid)); msb.CreateReport(reportObject); return reportObject.EmployeeDetailList .Where(employeeDetail => employeeDetail.Employee.Oid != null) .ToDictionary(employeeDetail => MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(employeeDetail.Employee), employeeDetail => employeeDetail.UeberstundenGesamt ?? 0); } public String SendTimeSheetMail(TimeSheetStatusItemDC item, bool saveMailToDatabase) { try { var s = PluginLoader.FindClass(); return s.SendTimeSheetMail(item, saveMailToDatabase); } catch (Exception e) { throw BeWo.Service.Core.Utils.CreateBeWoFaultException(e); } } public MemoryStream CreateCustomReport(long employeeOid, String reportName) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreateCustomReport(employeeOid, reportName)); } private static MemoryStream CreateReportStream(XtraReport pReport) { pReport.CreateDocument(); var resultStream = new MemoryStream(); var repxStream = new MemoryStream(); pReport.PrintingSystem.SaveDocument(repxStream, new NativeFormatOptions { Compressed = true }); var bytesToWrite = repxStream.ToArray(); resultStream.Write(bytesToWrite, 0, bytesToWrite.Length); resultStream.Position = 0L; return resultStream; } private static MemoryStream CreateReportStream(T pReport, U pRO) where T : XtraReport, IBeWoReport where U : AbstractBeWoReportObject { var report = pReport; report.SetReportDataSource(pRO); report.CreateDocument(); var resultStream = new MemoryStream(); var repxStream = new MemoryStream(); report.PrintingSystem.SaveDocument(repxStream, new NativeFormatOptions { Compressed = true }); var bytesToWrite = repxStream.ToArray(); resultStream.Write(bytesToWrite, 0, bytesToWrite.Length); resultStream.Position = 0L; return resultStream; } private static AbstractReportCreator GetReportCreator() { var derTenant = MultitenancyOperationContextExt.Current.Tenant; AbstractReportCreator creator = null; #if DEBUG //Kundennummern zum Testen nur noch in PluginLoader eintragen: derTenant = PluginLoader.Tenant; var customerDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"bin\" + derTenant + "_reports.dll"); #else var customerDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Customer\" + derTenant + "_reports.dll"); #endif if (File.Exists(customerDllPath)) { var allTypes = Assembly.LoadFrom(customerDllPath).GetTypes(); var reportCreator = allTypes.FirstOrDefault(i => typeof(AbstractReportCreator).IsAssignableFrom(i)); if (reportCreator != null) { creator = Activator.CreateInstance(reportCreator) as AbstractReportCreator; } } if (creator == null) creator = new DefaultReportCreator(); creator.Tenant = derTenant; creator.ReportPath = customerDllPath; #if DEBUG creator.TempPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"demo\temp"); #else creator.TempPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, derTenant + @"\temp"); #endif return creator; } private static AbstractReportCreator GetReportCreator(string tenant) { AbstractReportCreator creator = null; #if DEBUG //Kundennummern zum Testen nur noch in PluginLoader eintragen: tenant = PluginLoader.Tenant; // Ist "C:\Users\lyndo\BeWo\BeWoPlanerMobil\bin\2387527289_reports.dll" // statt "C:\Users\lyndo\BeWo\Host\bin\2387527289_reports.dll" var path = @"..\Host\"; var customerDllPath = Path.Combine(path, @"bin\" + tenant + "_reports.dll");// Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"bin\" + tenant + "_reports.dll"); #else var customerDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Customer\" + tenant + "_reports.dll"); #endif if (File.Exists(customerDllPath)) { var allTypes = Assembly.LoadFrom(customerDllPath).GetTypes(); var reportCreator = allTypes.FirstOrDefault(i => typeof(AbstractReportCreator).IsAssignableFrom(i)); if (reportCreator != null) { creator = Activator.CreateInstance(reportCreator) as AbstractReportCreator; } } if (creator == null) { creator = new DefaultReportCreator(); } creator.Tenant = tenant; creator.ReportPath = customerDllPath; #if DEBUG creator.TempPath = Path.Combine(path, @"demo\temp"); #else creator.TempPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, tenant + @"\temp"); #endif return creator; } private static BeWoEntityBase LoadToBargeldkasseRelatedObject(TableID pObjectTid, long pObjectOid) { switch (pObjectTid) { case TableID.Customer: return DAOFactory.GenericDAO.LoadByID(pObjectOid); default: return null; } } public MemoryStream CreateKilometerauswertung(long customerOid, DateTime rangeDate) { var reportCreator = GetReportCreator(); var report = reportCreator.CreateKilometerauswertung(customerOid, null, new DateTime(rangeDate.Year, rangeDate.Month, 1), new DateTime(rangeDate.Year, rangeDate.Month, 1).AddMonths(1).AddDays(-1)); return report == null ? null : CreateReportStream(report); } public MemoryStream CreateKilometerauswertungForAllCustomers(List customerOids, DateTime rangeDate) { var reportCreator = GetReportCreator(); var report = reportCreator.CreateKilometerauswertungForAllCustomers(customerOids, null, new DateTime(rangeDate.Year, rangeDate.Month, 1), new DateTime(rangeDate.Year, rangeDate.Month, 1).AddMonths(1).AddDays(-1)); return report == null ? null : CreateReportStream(report); } public bool CheckForAnyServiceRecordsWithDistanceValues(List customerOids, DateTimeSpan span) { return DAOFactory.SearchDAO.CheckForAnyServiceRecordsWithDistanceValues(customerOids, span); } public MemoryStream CreateEmployeeKilometerauswertung(long employeeOid, DateTime range) { var reportCreator = GetReportCreator(); var report = reportCreator.CreateEmployeeKilometerauswertung(employeeOid, null, range, range); return report == null ? null : CreateReportStream(report); } public MemoryStream CreateKilometerauswertungForAllEmployees(List employeeOids, DateTime rangeDate) { var reportCreator = GetReportCreator(); var report = reportCreator.CreateKilometerauswertungForAllEmployees(employeeOids, null, new DateTime(rangeDate.Year, rangeDate.Month, 1), new DateTime(rangeDate.Year, rangeDate.Month, 1).AddMonths(1).AddDays(-1)); return report == null ? null : CreateReportStream(report); } // Zum Test im MoK public MemoryStream CreateKilometerauswertungForAllCustomersForWebVersion(List customerOids, DateTime rangeDate, string tenant) { var reportCreator = GetReportCreator(tenant); var report = reportCreator.CreateKilometerauswertungForAllCustomers(customerOids, null, new DateTime(rangeDate.Year, rangeDate.Month, 1), new DateTime(rangeDate.Year, rangeDate.Month, 1).AddMonths(1).AddDays(-1)); return report == null ? null : CreateReportStream(report); } public MemoryStream CreateMedikamentenlistenReport(long mvlOid, string tenant) { var reportCreator = GetReportCreator(tenant); var report = reportCreator.CreateMediVerordListenReport(mvlOid); return report == null ? null : CreateReportStream(report); } public MemoryStream CreateInvoiceListReport(List invoiceBaseOids) { return null; } } }