using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Web.Mvc; using BeWo.Service.Security; using BeWoPlanerMobil.Models; using BeWoPlanerMobil.Service; using BeWoPlanerMobil.Util; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using DevExpress.XtraReports.UI; namespace BeWoPlanerMobil.Controllers { public class ReportViewerController : AbstractBaseController { private ReportViewerModel _Model; public ReportViewerModel Model { get { if(!MobileSessionFacade.IsUserLoggedIn()) { RedirectToActionPermanent("Index", "Login"); return null; } if(((ReportViewerModel)Session[ModelSessionConstants.ReportViewerModelKey])?.Employee is null) { _Model = new ReportViewerModel { Employee = MobileSessionFacade.LoggedInEmployee }; Session[ModelSessionConstants.ReportViewerModelKey] = _Model; } else { _Model = (ReportViewerModel)Session[ModelSessionConstants.ReportViewerModelKey]; } return _Model; } } public ActionResult ReportViewer() { Model.Report = null; var month = DateTime.Today.Month; var year = DateTime.Today.Year; var first = new DateTime(year, month, 1).AddMonths(-1); Model.SelectedYear = Model.SelectedYear ?? first.Year; Model.SelectedMonth = Model.SelectedMonth ?? first.Month; Model.AllEmployees = AbstractModel.HasRightMitarbeiterstundenkontoViewAll ? EmployeeService.GetActiveCompactEmployeesForEmployee(MobileSessionFacade.LoggedInCompactEmployee.EmployeeOid) : new List { MobileSessionFacade.LoggedInCompactEmployee }; // Alle Teams darf man nur sehen, wenn man das Recht "HasRightMitarbeiterstundenkontoViewAll" hat. // Hat man weder das Recht "HasRightMitarbeiterstundenkontoViewAll" noch "HasRightMitarbeiterstundenkontoViewTeams", sieht man die Teams gar nicht. // Hat man das Recht "HasRightMitarbeiterstundenkontoViewTeams", aber nicht das Recht "HasRightMitarbeiterstundenkontoViewAll", sieht man nur die Teams, deren Teamleiter man ist. var test = EmployeeService.FindLeadingCompactTeamsOfEmployee(MobileSessionFacade.LoggedInCompactEmployee.EmployeeOid); Model.AllTeams = AbstractModel.HasRightMitarbeiterstundenkontoViewAll ? EmployeeService.GetAllActiveCompactTeamsForEmployee(MobileSessionFacade.LoggedInEmployee.EmployeeOid) : EmployeeService.FindLeadingCompactTeamsOfEmployee(MobileSessionFacade.LoggedInCompactEmployee.EmployeeOid); if(!AbstractModel.HasRightMitarbeiterstundenkontoViewAll) { Model.SelectedEmployeeOid = MobileSessionFacade.LoggedInCompactEmployee.EmployeeOid; } // ToDo: Hat man das Recht "Nur Team" nicht, kann man nur die Teams sehen, bei denen man auch Leiter ist. if(!AbstractModel.HasRightMitarbeiterstundenkontoViewTeams) { } Model.ReportTypes = new List(); if(AbstractModel.HasRightToViewReports) { Model.ReportTypes.Add(new SelectListItem { Text = "Berichte", Value = "0" }); } if(AbstractModel.HasRightToViewMitarbeiterstundenkonto) { Model.ReportTypes.Add(new SelectListItem { Text = "Mitarbeiterstundenkonto", Value = "1" }); } Model.SelectedReportType = ReportType.Berichte; Model.Queries = QueryService.GetAllQueriesOfType(QueryType.Public); return View(Model); } [Authorize] public ActionResult DocumentWebViewerPartial() { return PartialView("DocumentWebViewerPartial", Model); } [Authorize] public ActionResult LoadCustomReport(long? reportOid) { if(Model?.Employee?.EmployeeOid is null || reportOid is null) { return Logout(); } var selectedQuery = Model.Queries.FirstOrDefault(query => query.Oid.Equals(reportOid.Value)); if(selectedQuery is null) { Model.Report = null; return PartialView("DocumentWebViewerPartial", Model); } var queryReportUri = GetQueryReportUrl(selectedQuery); var baseUri = SecurityUtils.RemoveAuthenticationInfoFromUri(queryReportUri); var test = QueryService.ExecuteQuery(selectedQuery.Oid, null); if(test is null) { return PartialView("DocumentWebViewerPartial", Model); } QueryService.PrepareQueryReport(test, $"{MobileSessionFacade.Tenant}queryeoid{Model.Employee.EmployeeOid.Value}"); var tempToken = DownloadService.CreateTemporaryToken(baseUri, false); var addChar = baseUri.Contains("?") ? "&" : "?"; var finalUri = $"{baseUri}{addChar}token={tempToken}"; var webClient = new WebClient(); var data = webClient.DownloadData(finalUri); var report = new XtraReport(); using(var memoryStream = new MemoryStream(data)) { report.PrintingSystem.LoadDocument(memoryStream); } Model.Report = report; return PartialView("DocumentWebViewerPartial", Model); } [Authorize] private string GetQueryReportUrl(QueryDC query) { var url = Request?.Url; if(Model?.Employee?.EmployeeOid is null || url is null || query is null) { return null; } //DEBUG: http://localhost:3777/service //RELEASE: https://app4.bewoplaner.de/service // http://localhost:3777/Host/ReportView.aspx?dcid=demoqueryeoid372&qoid=1304&type=QueryReport var urlSuffix = $"/ReportView.aspx?dcid={MobileSessionFacade.Tenant}queryeoid{Model.Employee.EmployeeOid.Value}&qoid={query.Oid}&type={Utils.EnumName(ReportTypes.QueryReport)}"; return GetSiteOfOrigin() + urlSuffix; } private string GetSiteOfOrigin() { if(Model?.Employee?.EmployeeOid is null) { return null; } var url = Request?.Url; #if DEBUG return "http://localhost:3777/Host"; #endif return $"{url.Scheme}//{url.Host}"; } [Authorize] public ActionResult LoadViewerForm(string reportType) { if(Model is null) { return Logout(); } Model.SelectedReportType = reportType == "0" ? ReportType.Berichte : ReportType.Mitarbeiterstundenkonto; return PartialView("ReportViewerFormPartial", Model); } [Authorize] public ActionResult LoadMitarbeiterstundenkonto(string parameters) { if(Model?.Employee?.EmployeeOid is null) { return Logout(); } if(!string.IsNullOrWhiteSpace(parameters)) { var splitParameters = parameters.Split(';'); if(splitParameters.Length == 6) { var month = int.Parse(splitParameters[0]); var year = int.Parse(splitParameters[1]); var isEmployee = bool.Parse(splitParameters[2]); var all = bool.Parse(splitParameters[3]); long? oid = null; if(long.TryParse(splitParameters[4], out var oOid)) { oid = oOid; } var ansicht = int.Parse(splitParameters[5]); var siteOfOrigin = GetSiteOfOrigin(); var url = $"{siteOfOrigin}/ReportView.aspx?type={Utils.EnumName(ReportTypes.EmployeeHourReport)}"; if(isEmployee) { var employeeOid = oid; if(all || !AbstractModel.HasRightMitarbeiterstundenkontoViewAll) { employeeOid = null; } if(!(employeeOid is null)) { employeeOid = oid; } if(!AbstractModel.HasRightMitarbeiterstundenkontoViewAll) { employeeOid = Model.Employee.EmployeeOid; } if(employeeOid > 0) { url += $"&eoid={employeeOid}"; } } else { var teamOid = oid; if(all || (!AbstractModel.HasRightMitarbeiterstundenkontoViewAll && !AbstractModel.HasRightMitarbeiterstundenkontoViewTeams)) { teamOid = null; } if(!(teamOid is null)) { teamOid = oid; } url += "&toid="; if(teamOid > 0 && !all) { url += $"{teamOid}"; } else if(all) { url += string.Join(",", Model.AllTeams.Select(team => team.TeamOid)); } } url += $"&m={month}&y={year}"; if(ansicht != 0) { url += $"&ansicht={ansicht}"; } var tempToken = DownloadService.CreateTemporaryToken(url, true); url += $"&token={tempToken}"; var webClient = new WebClient(); var data = webClient.DownloadData(url); var report = new XtraReport(); using(var memoryStream = new MemoryStream(data)) { report.PrintingSystem.LoadDocument(memoryStream); } Model.Report = report; } } return PartialView("DocumentWebViewerPartial", Model); } } }