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) { if (pReport == null) return null; 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() { AbstractReportCreator creator = PluginLoader.FindClass(); #if DEBUG creator.TempPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"demo\temp"); #else creator.TempPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, PluginLoader.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(); 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(); var report = reportCreator.CreateMediVerordListenReport(mvlOid); return report == null ? null : CreateReportStream(report); } public MemoryStream CreateInvoiceListReport(List invoiceBaseOids) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreateInvoiceListReport(invoiceBaseOids)); } public MemoryStream CreateCustomerListReport(List oids) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreateCustomerListReport(oids)); } public MemoryStream CreateSupportConceptListReport(List oids) { return null; } public MemoryStream CreatePersonListReport(List oids) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreatePersonListReport(oids)); } public MemoryStream CreateEmployeeListReport(List oids) { return null; } public MemoryStream CreateOrganisationListReport(List oids) { return null; } public MemoryStream CreateTeamListReport(List oids) { return null; } public MemoryStream CreateUserListReport(List oids) { return null; } public MemoryStream CreateUserGroupListReport(List oids) { var reportCreator = GetReportCreator(); return CreateReportStream(reportCreator.CreateUserGroupListReport(oids)); } } }