Files
BeWoPlaner/BeWoPlanerMobil/Controllers/ReportViewerController.cs
Lyndon Jetten 3ca4ec5323 Das Gruppenbuchungsformular hat jetzt die Summe der Ziele aller ausgewählten Hilfepläne und die Schnittmenge deren Leistungen und Kategorien.
Das Mehrfachbuchungsformular hat ebenfalls die Schnittmenge der Leistungen und Kategorien von den ausgewählten Hilfeplänen.

Das Caching ist wieder aktiviert. Und lädt pro Post-Aufruf nur noch einmal 13 MB und danach nur noch 300 kb herunter.

Überall konsequent geprüft, ob das Model nicht null ist und falls dem so ist, wird ausgeloggt, damit es zu keinen Fehlern mehr kommt.
2024-06-26 12:29:22 +02:00

309 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using BeWo.Report;
using BeWo.Service.Plugins;
using BeWoPlanerMobil.Models;
using BeWoPlanerMobil.Service;
using BeWoPlanerMobil.Util;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
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, ReportCreator = GetReportCreator() };
Session[ModelSessionConstants.ReportViewerModelKey] = _Model;
}
else
{
_Model = (ReportViewerModel)Session[ModelSessionConstants.ReportViewerModelKey];
}
return _Model;
}
}
[Authorize]
public ActionResult ReportViewer()
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return Logout();
}
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.GetAllActiveEmployeesCompact()
: new List<CompactEmployeeDC> { 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.
Model.AllTeams = AbstractModel.HasRightMitarbeiterstundenkontoViewAll
? EmployeeService.GetAllActiveCompactTeamsForEmployee(MobileSessionFacade.LoggedInEmployee.EmployeeOid)
: EmployeeService.FindLeadingCompactTeamsOfEmployee(MobileSessionFacade.LoggedInCompactEmployee.EmployeeOid);
if(!AbstractModel.HasRightMitarbeiterstundenkontoViewAll)
{
Model.SelectedEmployeeOid = MobileSessionFacade.LoggedInCompactEmployee.EmployeeOid;
}
Model.ReportTypes = new List<SelectListItem>();
//if(AbstractModel.HasRightToViewReports)
//{
// Model.ReportTypes.Add(new SelectListItem
// {
// Text = "Berichte",
// Value = "0"
// });
//}
if(AbstractModel.HasRightToViewMitarbeiterstundenkonto)
{
Model.ReportTypes.Add(new SelectListItem
{
Text = "Mitarbeiterstundenkonto",
Value = "1"
});
}
// ToDo: Bis auf weiteres nur Mitarbeiterstundenkonto anzeigen!
Model.SelectedReportType = ReportType.Mitarbeiterstundenkonto;//ReportType.Berichte;
Model.Queries = QueryService.GetAllQueriesOfType(QueryType.Public);
return View(Model);
}
[Authorize]
public ActionResult DocumentWebViewerPartial()
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
}
return PartialView("DocumentWebViewerPartial", Model);
}
[Authorize]
public ActionResult LoadCustomReport(long? reportOid)
{
try
{
if (Model?.Employee?.EmployeeOid is null || reportOid is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return PartialView("DocumentWebViewerPartial");
}
var selectedQuery = Model.Queries.FirstOrDefault(query => query.Oid.Equals(reportOid.Value));
var queryParameter = selectedQuery?.Parameter ?? new List<QueryParamDC>();
if (selectedQuery is null)
{
Model.Report = null;
return PartialView("DocumentWebViewerPartial", Model);
}
var dcid = $"{MobileSessionFacade.Tenant}queryeoid{Model.Employee.EmployeeOid.Value}";
var test = QueryService.ExecuteQuery(selectedQuery.Oid, null);
if (test is null)
{
return PartialView("DocumentWebViewerPartial", Model);
}
QueryService.PrepareQueryReport(test, dcid);
var queryReport = Model.ReportCreator.CreateQueryReport(selectedQuery.Oid, dcid);
Model.Report = queryReport;
}
catch (Exception e)
{
Log.Error(e);
TempData[TempDataConstants.ErrorMessageKey] = e.Message;
}
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}/service";
}
[Authorize]
public ActionResult LoadViewerForm(string reportType)
{
if(Model is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return PartialView("ReportViewerFormPartial");
}
Model.SelectedReportType = reportType == "0" ? ReportType.Berichte : ReportType.Mitarbeiterstundenkonto;
return PartialView("ReportViewerFormPartial", Model);
}
[Authorize]
public ActionResult LoadMitarbeiterstundenkonto(string parameters)
{
if(Model?.Employee?.EmployeeOid is null)
{
TempData[TempDataConstants.DoLogoutKey] = true;
return PartialView("DocumentWebViewerPartial");
}
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? employeeOid = null;
List<long> teamOids = null;
long? oid = null;
if(long.TryParse(splitParameters[4], out var oOid))
{
oid = oOid;
}
var ansicht = int.Parse(splitParameters[5]);
if(isEmployee)
{
employeeOid = oid;
if(all || !AbstractModel.HasRightMitarbeiterstundenkontoViewAll)
{
employeeOid = null;
}
if(!(employeeOid is null))
{
employeeOid = oid;
}
if(!AbstractModel.HasRightMitarbeiterstundenkontoViewAll)
{
employeeOid = Model.Employee.EmployeeOid;
}
}
else
{
teamOids = new List<long>();
var teamOid = oid;
if(all || (!AbstractModel.HasRightMitarbeiterstundenkontoViewAll && !AbstractModel.HasRightMitarbeiterstundenkontoViewTeams))
{
teamOid = null;
}
if(!(teamOid is null))
{
teamOid = oid;
}
if(teamOid > 0 && !all)
{
teamOids.Add(teamOid.Value);
}
else if(all)
{
teamOids.AddRange(Model.AllTeams.Select(team => team.TeamOid));
}
}
var start = new DateTime(year, month, 1);
var end = start.AddMonths(1);
var report = Model.ReportCreator.CreateEmployeeHourReport(employeeOid, teamOids, start, end, ansicht);
Model.Report = report;
}
}
return PartialView("DocumentWebViewerPartial", Model);
}
private static AbstractReportCreator GetReportCreator()
{
AbstractReportCreator creator = PluginLoader.FindClass<DefaultReportCreator>() ?? new DefaultReportCreator();
var mobileBaseDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\Host\");
#if DEBUG
creator.TempPath = BS.Shared.Core.Utils.CreateSavePath(mobileBaseDirectory, @"demo\temp");
#else
creator.TempPath = BS.Shared.Core.Utils.CreateSavePath(mobileBaseDirectory, PluginLoader.Tenant + @"\temp");
#endif
return creator;
}
}
}