244 lines
8.1 KiB
C#
244 lines
8.1 KiB
C#
using System;
|
|
using System.Linq;
|
|
#if !NET8
|
|
using System.Web;
|
|
using System.Web.Mvc;
|
|
#endif
|
|
|
|
#if NET8
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
#endif
|
|
|
|
using Fab2ApprovalSystem.DMO;
|
|
using Fab2ApprovalSystem.Misc;
|
|
using Fab2ApprovalSystem.Models;
|
|
|
|
#if !NET8
|
|
using System.Collections.Generic;
|
|
using Fab2ApprovalSystem.ViewModels;
|
|
#endif
|
|
|
|
namespace Fab2ApprovalSystem.Controllers;
|
|
|
|
[Authorize]
|
|
#if !NET8
|
|
[SessionExpireFilter]
|
|
#endif
|
|
#if NET8
|
|
[Route("[controller]")]
|
|
#endif
|
|
public class ReportsController : Controller {
|
|
|
|
public const string specialNullString = "~NULL~";
|
|
private readonly AppSettings? _AppSettings = GlobalVars.AppSettings;
|
|
|
|
// GET: Export
|
|
public ActionResult Index() {
|
|
UserAccountDMO userDMO = new();
|
|
ViewBag.HasITARAccess = userDMO.GetITARAccess(GlobalVars.GetUserId(GetSession()));
|
|
|
|
return View();
|
|
}
|
|
|
|
#if !NET8
|
|
|
|
public ActionResult Report(string id, string docType = "") {
|
|
if (string.IsNullOrEmpty(id))
|
|
return RedirectToAction("Index");
|
|
|
|
UserAccountDMO userDMO = new();
|
|
if (!userDMO.GetITARAccess(GlobalVars.GetUserId(GetSession())))
|
|
return View("UnAuthorizedAccess");
|
|
|
|
ReportViewModel<SelectListItem> m = new();
|
|
var reports = GetReportList(docType);
|
|
foreach (var report in reports) {
|
|
if (string.Equals(report.ReportID, id, StringComparison.OrdinalIgnoreCase)) {
|
|
m.ReportID = report.ReportID;
|
|
m.ReportName = report.Name;
|
|
m.Description = report.Description;
|
|
m.DocType = docType;
|
|
|
|
var c = SetupSSRSHelperClient();
|
|
|
|
m.Parameters = c.GetReportParameters(report.FullPath).Select(parm => {
|
|
ReportParameterViewModel<SelectListItem> r = new();
|
|
r.Visible = (parm.PromptUser.HasValue == false || parm.PromptUser == true) && !string.IsNullOrEmpty(parm.Prompt);
|
|
r.Prompt = parm.Prompt;
|
|
r.Name = parm.Name;
|
|
r.HtmlID = "parm_" + parm.Name;
|
|
|
|
if (parm.MultiValue.HasValue && parm.MultiValue.Value)
|
|
r.ControlType = ParameterControlTypes.Multiselect;
|
|
else if ((parm.ValidValues != null) && (parm.ValidValues.Length > 0))
|
|
r.ControlType = ParameterControlTypes.Dropdown;
|
|
else if (parm.DataType.Equals("DateTime", StringComparison.OrdinalIgnoreCase))
|
|
r.ControlType = ParameterControlTypes.DatePicker;
|
|
else
|
|
r.ControlType = ParameterControlTypes.Textbox;
|
|
|
|
r.SelectList = null;
|
|
if (parm.ValidValues != null) {
|
|
r.SelectList = parm.ValidValues.Select(vv => {
|
|
return new SelectListItem() {
|
|
Text = vv.Value,
|
|
Value = (vv.Key == null ? specialNullString : vv.Key),
|
|
Selected = (parm.DefaultValues != null && parm.DefaultValues.Contains(vv.Key))
|
|
};
|
|
}).ToList();
|
|
}
|
|
|
|
r.DefaultValue = "";
|
|
if (parm.DefaultValues != null && parm.DefaultValues.Length > 0)
|
|
r.DefaultValue = parm.DefaultValues[0];
|
|
|
|
return r;
|
|
|
|
}).ToArray();
|
|
}
|
|
}
|
|
|
|
return View(m);
|
|
}
|
|
|
|
public SSRSHelper.SSRSClient SetupSSRSHelperClient() {
|
|
var useCfgForBindings = false;
|
|
if (string.Equals(_AppSettings.SSRSBindingsByConfiguration, "true", StringComparison.OrdinalIgnoreCase))
|
|
useCfgForBindings = true;
|
|
|
|
var c = new SSRSHelper.SSRSClient(
|
|
Convert.ToString(_AppSettings.SSRSBaseURL),
|
|
Convert.ToString(_AppSettings.SSRSDomain),
|
|
Convert.ToString(_AppSettings.SSRSUsername),
|
|
Convert.ToString(_AppSettings.SSRSPassword),
|
|
useCfgForBindings);
|
|
c.Initialize();
|
|
|
|
return c;
|
|
}
|
|
|
|
private IEnumerable<SSRSHelper.ReportInfo> GetReportList(String docType) {
|
|
String folderName = Convert.ToString(_AppSettings.SSRSFolder);
|
|
if (folderName.EndsWith("/"))
|
|
folderName = folderName.TrimEnd('/');
|
|
if (!String.IsNullOrWhiteSpace(docType))
|
|
folderName = folderName + "/" + docType;
|
|
|
|
var c = SetupSSRSHelperClient();
|
|
return c.ListReports(folderName);
|
|
}
|
|
|
|
public ActionResult GetReports(string docType) {
|
|
var reports = GetReportList(docType);
|
|
|
|
return GetJsonResult(new {
|
|
Data =
|
|
reports.Select(r => new ReportViewModel<SelectListItem>() {
|
|
ReportName = r.Name ?? "",
|
|
Description = r.Description ?? "",
|
|
ReportID = r.ReportID ?? "",
|
|
DocType = docType
|
|
})
|
|
});
|
|
}
|
|
|
|
[HttpPost]
|
|
public ActionResult ExportReport(string DocType, string ReportID) {
|
|
var c = SetupSSRSHelperClient();
|
|
var reports = GetReportList(DocType);
|
|
|
|
var report = reports.Where(r => string.Equals(r.ReportID, ReportID, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
|
|
if (report == null)
|
|
return Content("Invalid report ID");
|
|
|
|
var reportParms = c.GetReportParameters(report.FullPath);
|
|
|
|
var parms = new SSRSHelper.ReportParameterCollection();
|
|
parms.Add("DocType", DocType);
|
|
parms.Add("UserID", GlobalVars.GetUserIdValue(GetSession()));
|
|
parms.Add("BaseURL", GlobalVars.hostURL);
|
|
|
|
foreach (var rp in reportParms) {
|
|
if (rp.MultiValue.HasValue && rp.MultiValue.Value) {
|
|
foreach (string v in Request.Params.GetValues("parm_" + rp.Name)) {
|
|
parms.Add(rp.Name, v);
|
|
}
|
|
} else {
|
|
string value = null;
|
|
|
|
if (Request.Params.AllKeys.Contains("parm_" + rp.Name))
|
|
value = Request.Params.GetValues("parm_" + rp.Name).FirstOrDefault();
|
|
|
|
if (value == specialNullString)
|
|
value = null;
|
|
|
|
if ((rp.AllowBlank.HasValue == false || rp.AllowBlank.Value == false) && value == "")
|
|
value = null;
|
|
|
|
if (value == null) {
|
|
if (rp.Nullable.HasValue == false || rp.Nullable.Value == false) {
|
|
if (rp.DefaultValues != null && rp.DefaultValues.Length > 0)
|
|
value = rp.DefaultValues[0];
|
|
if (value == null)
|
|
continue;
|
|
}
|
|
}
|
|
|
|
parms.Add(rp.Name, value);
|
|
}
|
|
}
|
|
|
|
var b = c.ExportReport(report.FullPath, GetUserIdentityName(), parms, "EXCELOPENXML");
|
|
try {
|
|
var b2 = c.FreezeExcelHeaders(b);
|
|
return File(b2, "application/octet-stream", MakeFilename(report.Name) + ".xlsx");
|
|
} catch {
|
|
}
|
|
return File(b, "application/octet-stream", MakeFilename(report.Name) + ".xlsx");
|
|
}
|
|
|
|
#endif
|
|
|
|
protected string MakeFilename(string reportName) {
|
|
string r = "";
|
|
char[] invalidChars = System.IO.Path.GetInvalidFileNameChars();
|
|
foreach (char c in reportName) {
|
|
if (invalidChars.Contains(c))
|
|
r += '_';
|
|
else
|
|
r += c;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
#if !NET8
|
|
|
|
private System.Web.HttpSessionStateBase GetSession() =>
|
|
Session;
|
|
|
|
private JsonResult GetJsonResult(object? data) =>
|
|
Json(data, JsonRequestBehavior.AllowGet);
|
|
|
|
private bool IsAjaxRequest() =>
|
|
Request.IsAjaxRequest();
|
|
|
|
#endif
|
|
|
|
#if NET8
|
|
|
|
private Microsoft.AspNetCore.Http.ISession GetSession() =>
|
|
HttpContext.Session;
|
|
|
|
private JsonResult GetJsonResult(object? data) =>
|
|
Json(data);
|
|
|
|
private bool IsAjaxRequest() =>
|
|
Request.Headers.TryGetValue("X-Requested-With", out Microsoft.Extensions.Primitives.StringValues strings) && strings[0] == "XMLHttpRequest";
|
|
|
|
#endif
|
|
|
|
private string GetUserIdentityName() =>
|
|
@User.Identity.Name;
|
|
|
|
} |