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.ServiceImplementations; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.Extensions; using DevExpress.XtraReports.UI; using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; namespace Mittelpunkt { public class CustomReportCreator : DefaultReportCreator { //public override XtraReport CreateAuslastungReport(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate) //{ // IBeWoReport report; // if (teamOids != null && teamOids.Count > 0) // report = FindReportImp("TeamauslastungNachMitarbeiter"); // else // report = FindReportImp("Mitarbeiterauslastung"); // var x = MitarbeiterauslastungRO.Create(employeeOid, teamOids, startDate, endDate); // report.SetReportDataSource(x); // return report as XtraReport; //} public override XtraReport CreateServiceOverviewAllCustomersReport(int month, int year, long orgaOid, long empOid, long? serviceCategoryOid, int startDay, int endDay) { List lROs = ServicesOverviewRO.Create(month, year, orgaOid, empOid, startDay, endDay, serviceCategoryOid, false); if (lROs.Count > 0) { var rootReport = CreateServicesOverviewReportForRo(lROs[0], serviceCategoryOid); if (rootReport.Pages.Count == 0) { rootReport.CreateDocument(); } for (int i = 1; i < lROs.Count; i++) { var lNext = CreateServicesOverviewReportForRo(lROs[i], serviceCategoryOid); if (lNext.Pages.Count == 0) { lNext.CreateDocument(); } rootReport.Pages.AddRange(lNext.Pages); } return rootReport; } return new XtraReport(); } public override XtraReport CreateServiceOverviewReportForCustomers(IList customerOids, int month, int year, long? orgaOid, long? empOid, long? serviceCategoryOid, int startDay, int endDay, bool nurFehlende) { var roList = new List(); foreach (var coid in customerOids) { var ro = ServicesOverviewRO.Create(coid, month, year, false, orgaOid ?? 0, empOid ?? 0, startDay, endDay, serviceCategoryOid); if (ro != null) { roList.Add(ro); } } roList = roList.OrderBy(ro => ro.CustomerLastName).ToList(); if (roList.Count > 0) { var rootReport = CreateServicesOverviewReportForRo(roList[0], serviceCategoryOid); rootReport.CreateDocument(); for (int i = 1; i < roList.Count; i++) { var lNext = CreateServicesOverviewReportForRo(roList[i], serviceCategoryOid); lNext.CreateDocument(); rootReport.Pages.AddRange(lNext.Pages); } return rootReport; } return new XtraReport(); } public override XtraReport CreateServiceOverviewSingleCustomerReport(long customerOid, int month, int year, long orgaOid, long empOid, long? serviceCategoryOid, int startDay, int endDay) { var ro = ServicesOverviewRO.Create(customerOid, month, year, false, orgaOid, empOid, startDay, endDay, serviceCategoryOid); return CreateServicesOverviewReportForRo(ro, serviceCategoryOid); } private XtraReport CreateServicesOverviewReportForRo(ServicesOverviewRO ro, long? serviceCategoryOid) { ServicesOverviewRO flsRo = ServicesOverviewRO.CopyFromRO(ro); ServicesOverviewRO assiRo = ServicesOverviewRO.CopyFromRO(ro); if (ro.Services != null) { if (ro.Services.Count == 0) ro.Services.Add(new ServicesOverviewRO.ServiceDetail()); foreach (ServicesOverviewRO.ServiceDetail s in ro.Services) { ServicesOverviewRO.CreateSignatureString(s); if (!s.ServiceCategory.IsNullOrEmpty() && s.ServiceCategory.ToLower().Contains("assistenz")) { assiRo.Services.Add(s); } else { flsRo.Services.Add(s); } } } XtraReport report = null; report = AddReportToReport(report, flsRo); report = AddReportToReport(report, assiRo); if (report == null) report = new XtraReport(); return report; } public override XtraReport CreateReportForServicesOverviewRo(ServicesOverviewRO ro, string reportId) { return CreateServicesOverviewReportForRo(ro, null); } private XtraReport AddReportToReport(XtraReport report, ServicesOverviewRO ro) where T : XtraReport, IBeWoReport, new() { if (ro.Services.Count > 0) { if (report == null) { report = new T(); ((T)report).SetReportDataSource(ro); } else { if (report.Pages.Count == 0) { report.CreateDocument(); } XtraReport newReport = new T(); ((T)newReport).SetReportDataSource(ro); newReport.CreateDocument(); report.Pages.AddRange(newReport.Pages); } } return report; } public override XtraReport CreateEmployeeHourReport(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate, int ansicht) { IBeWoReport report; if (ansicht == 1) { report = FindReportImp("Mitarbeiterarbeitszeitkonto"); } else if (ansicht == 2) { var reportjahr = FindReportImp("MitarbeiterstundenkontoJahr"); var jahrStart = new DateTime(startDate.Year, 1, 1); var ds = new MitarbeiterstundenkontoMonateRO(employeeOid, teamOids, jahrStart, endDate, null); reportjahr.SetReportDataSource(ds); return reportjahr as XtraReport; } else { if (teamOids != null && teamOids.Count > 0) { report = FindReportImp("Teamstundenkonto"); } else { report = FindReportImp("Mitarbeiterstundenkonto"); } } var reportObject = MitarbeiterstundenkontoRO.Create(employeeOid, teamOids, startDate, endDate, null); report.SetReportDataSource(reportObject); var xreport = report as XtraReport; xreport.CreateDocument(); // Bei Tagesansicht für jeden MA eine zweite Seite erstellt werden, die alle gesammelt am Ende angefügt werden if (ansicht == 1) { var reportObjectSeite2 = MitarbeiterstundenkontoRO.Create(employeeOid, teamOids, startDate, endDate, null); IBeWoReport report2 = new MitarbeiterarbeitszeitkontoSeite2(); report2.SetReportDataSource(reportObjectSeite2); var xreport2 = report2 as XtraReport; xreport2.CreateDocument(); xreport.Pages.AddRange(xreport2.Pages); } return xreport; } public override XtraReport CreateQueryReport(long queryOid, string queryReportId) { //if (queryOid == 4730) //{ // var query = DAOFactory.GenericDAO.LoadByID(queryOid); // if (query is null) // { // return new XtraReport(); // } // var path = Utils.CreateSavePath(TempPath, queryReportId + ".xml"); // var table = Utils.XMLDeserialize(path); // var queryReport = new GeplanteStunden(); // var queryReportObject = QueryRO.Create(query, table); // queryReport.SetReportDataSource(queryReportObject); // return queryReport as XtraReport; // } if (queryOid == 5000) { // nix tun, nur zur Uebersicht eingefuegt } else if (queryOid == 5001 || queryOid == 5002) { return CreateQueryReportArbeitstageMehrAls8h(queryOid, queryReportId); } else if (queryOid == 5005) { return CreateQueryReportZuschlaegeArbeit(queryOid, queryReportId); } //else //{ // var query = DAOFactory.GenericDAO.LoadByID(queryOid); // if (query is null) // { // return new XtraReport(); // } // var path = Utils.CreateSavePath(TempPath, queryReportId + ".xml"); // var table = Utils.XMLDeserialize(path); // var queryReport = new BeWo.Report.DefaultReports.Bericht(); // var queryReportObject = QueryRO.Create(query, table); // queryReport.SetReportDataSource(queryReportObject); // return queryReport as XtraReport; //} return base.CreateQueryReport(queryOid, queryReportId); } private XtraReport CreateQueryReportArbeitstageMehrAls8h(long queryOid, string queryReportId) { var query = DAOFactory.GenericDAO.LoadByID(queryOid); if (query == null) return new XtraReport(); var path = Path.Combine(TempPath, queryReportId + ".xml"); var table = Utils.XMLDeserialize(path); var qro = QueryRO.Create(query, table); if (qro.Rows.Count > 0) { DateTime startDate = DateTime.ParseExact(qro.Rows[0].Field1.ToString(), "yyyy-MM-dd", CultureInfo.InvariantCulture); DateTime endDate = new DateTime(startDate.Year, 12, 31); long? employeeOid = null; long? teamOid = null; if (qro.Rows[0].Field2 != null && qro.Rows[0].Field2.ToString() != "0") { long oid = Int64.Parse(qro.Rows[0].Field2.ToString()); if (queryOid == 5001) employeeOid = oid; else if (queryOid == 5002) teamOid = oid; } XtraReport bericht = null; if (employeeOid != null) { bericht = CreateAndAddArbeitstageMehrAls8hBericht((long)employeeOid, null, startDate, endDate); } else if (teamOid != null) { Team team = DAOFactory.GenericDAO.GetByID((long)teamOid); if (team != null) { bericht = CreateAndAddArbeitstageMehrAls8hBericht(null, team.Oid, startDate, endDate); //foreach (var employee in team.MemberList.OrderBy(e => e.Person.LastNameFirstName)) //{ // bericht = CreateAndAddArbeitstageMehrAls8hBericht((long)employee.Oid, startDate, endDate, bericht); //} } } else { bericht = CreateAndAddArbeitstageMehrAls8hBericht(null, null, startDate, endDate); // kein Mitarbeiter oder Team ausgewaehlt, Bericht wird fuer alle Mitarbeiter erstellt //var allEmployees = DAOFactory.GenericDAO.GetAllActiveAndArchived(); //foreach (var employee in allEmployees.OrderBy(e => e.Person.LastNameFirstName)) //{ // bericht = CreateAndAddArbeitstageMehrAls8hBericht((long)employee.Oid, startDate, endDate, bericht); //} } if (bericht != null) { return bericht; } } return new XtraReport(); } private XtraReport CreateAndAddArbeitstageMehrAls8hBericht(long? employeeOid, long? teamOid, DateTime startDate, DateTime endDate) { XtraReport result = null; List teamOids = null; if (teamOid.HasValue) { teamOids = new List { teamOid.Value }; } MitarbeiterstundenkontoMonateRO ro = new MitarbeiterstundenkontoMonateRO(employeeOid, teamOids, startDate, endDate, null); var msbm = new CustomMitarbeiterstundenkontoBerechnungMonate(); msbm.CreateReport(ro); if (ro.EmployeeInfoList != null && ro.EmployeeInfoList.Count > 0) { foreach (var employeeInfo in ro.EmployeeInfoList) { var einzelRo = new MitarbeiterstundenkontoMonateRO(employeeOid, teamOids, startDate, endDate, null); einzelRo.ReportStartDate = ro.ReportStartDate; einzelRo.ReportEndDate = ro.ReportEndDate; einzelRo.EmployeeInfoList.Add(employeeInfo); var arbeitstageMehrAls8h = FindeArbeitstageMehrAls8h(employeeInfo); if (arbeitstageMehrAls8h.Count > 0 && ro.EmployeeInfoList[0].EmployeeDetails.Count > 0) { einzelRo.EmployeeInfoList[0].EmployeeDetails[0].EmployeeDetail.Days = arbeitstageMehrAls8h; var employeeBericht = new ArbeitstageMehrAls8h(); employeeBericht.SetReportDataSource(einzelRo); employeeBericht.CreateDocument(); if (result == null) result = employeeBericht; else result.Pages.AddRange(employeeBericht.Pages); } } } return result; } private IList FindeArbeitstageMehrAls8h(MitarbeiterstundenkontoMonateRO.EmployeeInfo employeeInfo) { IList arbeitstageMehrAls8h = new List(); foreach (var employeeDetail in employeeInfo.EmployeeDetails) { foreach (var day in employeeDetail.EmployeeDetail.Days) { if (day.MinutesTotal > 480) { arbeitstageMehrAls8h.Add(day); } } } return arbeitstageMehrAls8h; } private XtraReport CreateQueryReportZuschlaegeArbeit(long queryOid, string queryReportId) { var query = DAOFactory.GenericDAO.LoadByID(queryOid); if (query == null) return new XtraReport(); var path = Path.Combine(TempPath, queryReportId + ".xml"); var table = Utils.XMLDeserialize(path); var qro = QueryRO.Create(query, table); if (qro.Rows.Count > 0) { DateTime startDate = DateTime.ParseExact(qro.Rows[0].Field1.ToString(), "yyyy-MM-dd", CultureInfo.InvariantCulture); DateTime endDate = new DateTime(startDate.Year, 12, 31); long? employeeOid = null; if (qro.Rows[0].Field2 != null && qro.Rows[0].Field2.ToString() != "0") { employeeOid = Int64.Parse(qro.Rows[0].Field2.ToString()); } IList teamOids = null; if (qro.Rows[0].Field3 != null && qro.Rows[0].Field3.ToString() != "0") { long teamOid = Int64.Parse(qro.Rows[0].Field3.ToString()); teamOids = new List(); teamOids.Add(teamOid); } var allEmployees = DAOFactory.GenericDAO.GetAllActiveAndArchived(); MitarbeiterstundenkontoRO mitarbeiterstundenkontoRO = MitarbeiterstundenkontoRO.Create(employeeOid, teamOids, startDate, endDate, null); ZuschlaegeArbeit zuschlaegeArbeit = new ZuschlaegeArbeit(); zuschlaegeArbeit.SetReportDataSource(mitarbeiterstundenkontoRO); zuschlaegeArbeit.CreateDocument(); return zuschlaegeArbeit; } return new XtraReport(); } public override XtraReport CreateAuslastungReport(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate) { if (teamOids != null && teamOids.Count > 0) { IBeWoReport firstreport; firstreport = new BeWo.Report.DefaultReports.Teamauslastung(); var firstRO = MitarbeiterauslastungRO.Create(employeeOid, teamOids, startDate, endDate); firstreport.SetReportDataSource(firstRO); var root = firstreport as XtraReport; root.CreateDocument(); IBeWoReport report; report = FindReportImp("Teamauslastung"); IList employeeOids = new List(); if (employeeOid.HasValue) { employeeOids.Add(employeeOid.Value); } var secondRO = MitarbeiterauslastungRO.Create(employeeOids, teamOids, startDate, endDate, false); report.SetReportDataSource(secondRO); var subreport = report as XtraReport; subreport.CreateDocument(); root.Pages.AddRange(subreport.Pages); return root; } else { IBeWoReport report; report = FindReportImp("Mitarbeiterauslastung"); IList employeeOids = new List(); if (employeeOid.HasValue) { employeeOids.Add(employeeOid.Value); } var x = MitarbeiterauslastungRO.Create(employeeOids, teamOids, startDate, endDate, false); report.SetReportDataSource(x); return report as XtraReport; } } public override XtraReport CreateRosterReportIst(long wOid, DateTime dt) { var opertionsService = new OperationsServiceImp(); var customerService = new CustomerServiceImp(); var employeeService = new EmployeeServiceImp(); var report = FindReportImp(); var dienstEintraege = opertionsService.GetAllDienstEintraegeAsList(wOid, dt.Year, dt.Month); var vertretungen = opertionsService.GetAllDienstvertretungenAsList(wOid, dt.Year, dt.Month); List employeeOids = new List(); foreach (var eintrag in dienstEintraege) { if (!employeeOids.Contains(eintrag.EmployeeOid)) employeeOids.Add(eintrag.EmployeeOid); } foreach (var vertretung in vertretungen) { if (!employeeOids.Contains(vertretung.EmployeeOid)) employeeOids.Add(vertretung.EmployeeOid); } List employee = new List(); foreach (var oid in employeeOids) employee.Add(MapperFactory.EmployeeDC_Employee.MapToNewDC(DAOFactory.GenericDAO.GetByID(oid))); List absences = employeeService.GetMultipleEmployeeAbsenceTimesForMonth(dt.Year, dt.Month, employeeOids); List feiertageDCs = opertionsService.ErstelleDefaultFeiertage(dt.Year).Where(f => f.Datum.Month == dt.Month).ToList(); Dictionary stundenBeiAbwesenheit = new Dictionary(); foreach (var emp in employee) // Irgendwo hier drin Fehler { ContractDC currentContract = null; foreach (var c in emp.Contracts) { if (!c.ContractEndDate.HasValue) { if (dt >= c.EntryDate) { currentContract = c; break; } } else { if (dt >= c.EntryDate && dt <= c.ContractEndDate) { currentContract = c; break; } } } if (currentContract != null) { if ((currentContract.WeeklyTotalHours == null && currentContract.MonthlyTotalHours == null) || currentContract.WeeklyDays == null) continue; else { if (currentContract.WeeklyTotalHours != null) stundenBeiAbwesenheit.Add(emp.EmployeeOid, currentContract.WeeklyTotalHours.Value / currentContract.WeeklyDays); else if (currentContract.MonthlyTotalHours != null) stundenBeiAbwesenheit.Add(emp.EmployeeOid, currentContract.MonthlyTotalHours.Value / DateTime.DaysInMonth(dt.Year, dt.Month)); } } } report.SetReportDataSource(RosterIstRO.Create(dienstEintraege, vertretungen, employee, opertionsService.GetAllDienste(wOid), customerService.GetAllActiveWohnheimeCompact().First(x => x.WohnheimOid == wOid), dt.Year, dt.Month, feiertageDCs, absences, stundenBeiAbwesenheit)); return report as XtraReport; } } }