2023-03-16 13:57:04 +01:00
using System ;
using System.Collections.Generic ;
2023-03-27 17:41:58 +02:00
using System.IO ;
using System.Linq ;
using System.Net ;
2023-03-16 13:57:04 +01:00
using System.Web.Mvc ;
2023-03-27 17:41:58 +02:00
using BeWo.Service.Security ;
2023-03-16 13:57:04 +01:00
using BeWoPlanerMobil.Models ;
using BeWoPlanerMobil.Service ;
using BeWoPlanerMobil.Util ;
using BS.Shared ;
2023-03-27 17:41:58 +02:00
using BS.Shared.Core ;
using BS.Shared.DataContracts ;
2023-05-17 13:58:10 +02:00
using BS.Shared.DataContracts.Compact ;
2023-03-27 17:41:58 +02:00
using DevExpress.XtraReports.UI ;
2023-03-16 13:57:04 +01:00
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 ( )
{
2023-05-15 11:54:13 +02:00
Model . Report = null ;
2023-03-16 13:57:04 +01:00
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 ;
2023-05-17 13:58:10 +02:00
Model . AllEmployees = AbstractModel . HasRightMitarbeiterstundenkontoViewAll
? EmployeeService . GetActiveCompactEmployeesForEmployee ( MobileSessionFacade . LoggedInCompactEmployee . EmployeeOid )
: new List < CompactEmployeeDC > { MobileSessionFacade . LoggedInCompactEmployee } ;
2023-03-16 13:57:04 +01:00
2023-05-17 13:58:10 +02:00
// 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 )
2023-03-16 13:57:04 +01:00
{
2023-05-17 13:58:10 +02:00
}
Model . ReportTypes = new List < SelectListItem > ( ) ;
if ( AbstractModel . HasRightToViewReports )
{
Model . ReportTypes . Add ( new SelectListItem
2023-03-16 13:57:04 +01:00
{
Text = "Berichte" ,
Value = "0"
2023-05-17 13:58:10 +02:00
} ) ;
}
if ( AbstractModel . HasRightToViewMitarbeiterstundenkonto )
{
Model . ReportTypes . Add ( new SelectListItem
2023-03-16 13:57:04 +01:00
{
Text = "Mitarbeiterstundenkonto" ,
Value = "1"
2023-05-17 13:58:10 +02:00
} ) ;
}
2023-03-16 13:57:04 +01:00
Model . SelectedReportType = ReportType . Berichte ;
Model . Queries = QueryService . GetAllQueriesOfType ( QueryType . Public ) ;
return View ( Model ) ;
}
[Authorize]
2023-03-27 17:41:58 +02:00
public ActionResult DocumentWebViewerPartial ( )
2023-03-16 13:57:04 +01:00
{
return PartialView ( "DocumentWebViewerPartial" , Model ) ;
}
2023-03-27 17:41:58 +02:00
[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)}" ;
2023-05-15 11:54:13 +02:00
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 ( ';' ) ;
2023-03-27 17:41:58 +02:00
2023-05-15 11:54:13 +02:00
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 ] ) ;
2023-05-17 13:58:10 +02:00
long? oid = null ;
if ( long . TryParse ( splitParameters [ 4 ] , out var oOid ) )
{
oid = oOid ;
}
2023-05-15 11:54:13 +02:00
var ansicht = int . Parse ( splitParameters [ 5 ] ) ;
var siteOfOrigin = GetSiteOfOrigin ( ) ;
var url = $"{siteOfOrigin}/ReportView.aspx?type={Utils.EnumName(ReportTypes.EmployeeHourReport)}" ;
if ( isEmployee )
{
2023-05-17 13:58:10 +02:00
var employeeOid = oid ;
2023-05-15 11:54:13 +02:00
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
{
2023-05-17 13:58:10 +02:00
var teamOid = oid ;
2023-05-15 11:54:13 +02:00
2023-05-17 13:58:10 +02:00
if ( all | | ( ! AbstractModel . HasRightMitarbeiterstundenkontoViewAll & & ! AbstractModel . HasRightMitarbeiterstundenkontoViewTeams ) )
2023-05-15 11:54:13 +02:00
{
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 ) ;
2023-03-27 17:41:58 +02:00
}
2023-03-16 13:57:04 +01:00
}
}