using DevExpress.Utils; using DevExpress.Web; using DevExpress.Web.ASPxThemes; using DevExpress.Web.Mvc; using DevExpress.XtraPrinting; using DevExpress.XtraScheduler; using GreenTree.Nachtragsmanagement.Core.Authentication; using GreenTree.Nachtragsmanagement.Core.Domain.Deviation; using GreenTree.Nachtragsmanagement.Core.Domain.User; using GreenTree.Nachtragsmanagement.Services.Appendix; using GreenTree.Nachtragsmanagement.Services.Deviation; using GreenTree.Nachtragsmanagement.Services.Logging; using GreenTree.Nachtragsmanagement.Services.Misc; using GreenTree.Nachtragsmanagement.Services.Scheduling; using GreenTree.Nachtragsmanagement.Services.User; using GreenTree.Nachtragsmanagement.Web.Framework.Authorization; using GreenTree.Nachtragsmanagement.Web.Models.Global; using GreenTree.Nachtragsmanagement.Web.Models.Misc; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.UI; using System.Web.UI.WebControls; namespace GreenTree.Nachtragsmanagement.Web.Controllers { public class MiscController : Controller { private readonly IMiscService _miscService; private readonly IUserService _userService; private readonly INotificationService _notificationService; private readonly INotificationScheduler _notificationScheduler; private readonly IUserHelper _userHelper; private readonly ILogger _logger; public MiscController( IMiscService miscService, IUserService userService, INotificationService notificationService, INotificationScheduler notificationScheduler, IUserHelper userHelper, ILogger logger) { _miscService = miscService; _userService = userService; _notificationService = notificationService; _notificationScheduler = notificationScheduler; _userHelper = userHelper; _logger = logger; ViewData["AllUsers"] = _userService.GetAllUsers(); ViewData["AllUsersWithRole"] = _userService.GetAllUsers() .Select(u => new { Id = u.Id, Description = String.Format("{0} - {1}", u.Lastname, String.Join(", ", u.Roles .Select(r => r.Description))) }) .ToList(); ViewData["AllNotificationPlugins"] = _notificationService.GetNotificationPlugins(); } #region MailNotifications /// /// Basic mailNotification view function /// [FunctionAuthorize(true, "Misc-MailNotifications")] public ActionResult ViewMailNotifications() { var mailNotifications = _miscService.GetAllMailNotifications(); var mailNotificationModels = mailNotifications .Select(u => MailNotificationDataModel.FromMailNotification( u, false, _notificationService, _notificationScheduler)) .ToList(); return View("~/Views/Misc/MailNotifications.cshtml", mailNotificationModels); } /// /// Get JSON data of specific mailNotification /// /// MailNotification id. public ActionResult GetMailNotification(int id = -1) { var mailNotification = _miscService.GetMailNotificationById(id); if (mailNotification == null) return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet }; var mailNotificationModel = MailNotificationDataModel.FromMailNotification( mailNotification, false, _notificationService, _notificationScheduler); return new JsonResult { Data = JsonConvert.SerializeObject(mailNotificationModel), JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } /// /// Callback result for mailNotification grid /// /// The height of the grid scrollable component. public ActionResult PartialMailNotifications(int scrollHeight = -1) { var mailNotifications = _miscService.GetAllMailNotifications(); var mailNotificationModels = mailNotifications .Select(u => MailNotificationDataModel.FromMailNotification( u, false, _notificationService, _notificationScheduler)) .ToList(); ViewData["ScrollHeight"] = scrollHeight; return PartialView("~/Views/Misc/_MailNotificationGridPartial.cshtml", mailNotificationModels); } /// /// Callback result for mailNotification job combobox /// /// The system name of the corresponding notification plugin. public ActionResult PartialNotificationPluginJobs(string pluginSystemName) { var notificationPlugin = _notificationService.GetNotificationPlugin(pluginSystemName); if (notificationPlugin == null) return PartialView("~/Views/Misc/_MailNotificationPluginJobsPartial.cshtml", null); var mailNotificationModel = new MailNotificationDataModel { NotificationPlugin = notificationPlugin }; return PartialView("~/Views/Misc/_MailNotificationPluginJobsPartial.cshtml", mailNotificationModel); } /// /// Export result for mailNotification grid /// [HttpPost] public ActionResult ExportPartialMailNotifications(GridViewExportFormat exportformat) { if (exportformat == null || String.IsNullOrEmpty(exportformat.Format)) return new EmptyResult(); var mailNotifications = _miscService.GetAllMailNotifications(); var mailNotificationModels = mailNotifications .Select(u => MailNotificationDataModel.FromMailNotification( u, false, _notificationService, _notificationScheduler)) .ToList(); var viewContext = new ViewContext(); var viewPage = new ViewPage(); var htmlHelper = new HtmlHelper(viewContext, viewPage); var gridViewSettings = Extensions.GridViewSettingsHelper.MailNotificationGridViewSettings(htmlHelper); switch (exportformat.Format.ToLower()) { case "xlsx": return GridViewExtension.ExportToXlsx(gridViewSettings, mailNotificationModels); case "xls": return GridViewExtension.ExportToXls(gridViewSettings, mailNotificationModels); case "pdf": return GridViewExtension.ExportToPdf(gridViewSettings, mailNotificationModels); default: return new EmptyResult(); } } /// /// Partial edit for editing of existing or for new mailNotification /// /// Id for existing mailNotification, otherweise -1. public ActionResult EditMailNotification(int id = -1) { var mailNotification = _miscService.GetMailNotificationById(id); var mailNotificationModel = MailNotificationDataModel.FromMailNotification( mailNotification, true, _notificationService, _notificationScheduler); return PartialView("~/Views/Misc/_MailNotificationEditPartial.cshtml", mailNotificationModel); } /// /// Partial edit result if ModelState is valid, otherwise simple JSON result for success /// /// MailNotification model to be saved. [HttpPost, ValidateInput(false)] public ActionResult EditMailNotification(MailNotificationDataModel mailNotificationModel) { try { if (!ModelState.IsValid) { foreach (var role in mailNotificationModel.UserValues) mailNotificationModel.UserDescriptions.Add( ((IList)ViewData["AllUsers"]) .First(r => r.Id == role).Lastname); var notificationPlugin = _notificationService.GetNotificationPlugin(mailNotificationModel.NotificationPluginSystemName); if (notificationPlugin != null) mailNotificationModel.NotificationPlugin = notificationPlugin; return PartialView("~/Views/Misc/_MailNotificationEditPartial.cshtml", mailNotificationModel); } if (mailNotificationModel.CronExpression.Split(' ').Length == 5) mailNotificationModel.CronExpression = mailNotificationModel.CronExpression + " *"; var selectedUsers = _userService.GetUsersByIds(mailNotificationModel.UserValues.ToArray()); if (mailNotificationModel.Id == -1) { var mailNotification = mailNotificationModel.ToMailNotification(); mailNotification.SetUsers(selectedUsers); _miscService.InsertMailNotification(mailNotification); _logger.Entity(mailNotification, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies()); } else { var mailNotification = _miscService.GetMailNotificationById(mailNotificationModel.Id); mailNotification.CronExpression = mailNotificationModel.CronExpression; mailNotification.NotificationPluginSystemName = mailNotificationModel.NotificationPluginSystemName; mailNotification.NotificationJobSystemName = mailNotificationModel.NotificationJobSystemName; mailNotification.SetUsers(selectedUsers); _miscService.UpdateMailNotification(mailNotification); _logger.Entity(mailNotification, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies()); } _notificationScheduler.Start(); return new JsonResult { Data = "success" }; } catch (Exception ex) { _logger.Error("Fehler bei Speicherung einer Mail-Benachrichtigung.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } /// /// Simple JSON result for deleting a specific mailNotification /// /// MailNotification id. [HttpPost] public ActionResult DeleteMailNotification(int id) { try { var mailNotification = _miscService.GetMailNotificationById(id); if (mailNotification != null) _miscService.DeleteMailNotification(mailNotification); _logger.Entity(mailNotification, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies()); return new JsonResult { Data = "success" }; } catch (Exception ex) { _logger.Error("Fehler bei Löschung einer Mail-Benachrichtigung.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } /// /// Processes the specific mailNotification /// /// MailNotification id. [HttpPost] public ActionResult ProcessMailNotification(int id) { try { var mailNotification = _miscService.GetMailNotificationById(id); if (mailNotification != null) { var notificationPlugin = _notificationService.GetNotificationPlugin(mailNotification.NotificationPluginSystemName); notificationPlugin.ProcessNotifications(new[] { mailNotification }); } return new JsonResult { Data = "success" }; } catch (Exception ex) { _logger.Error("Fehler bei Ausführung einer Mail-Benachrichtigung.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } #endregion #region Logs /// /// Basic log view function /// [FunctionAuthorize(true, "Misc-Logs")] public ActionResult ViewLogs() { var logs = _logger.GetAllLogs(); var logModels = logs .Select(u => LogDataModel.FromLog(u, false)) .ToList(); return View("~/Views/Misc/Logs.cshtml", logModels); } /// /// Get JSON data of specific log /// /// Log id. public ActionResult GetLog(int id = -1) { var log = _logger.GetLogById(id); if (log == null) return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet }; var logModel = LogDataModel.FromLog(log, false); return new JsonResult { Data = JsonConvert.SerializeObject(logModel), JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } /// /// Callback result for log grid /// /// The height of the grid scrollable component. public ActionResult PartialLogs(int scrollHeight = -1) { var logs = _logger.GetAllLogs(); var logModels = logs .Select(u => LogDataModel.FromLog(u, false)) .ToList(); ViewData["ScrollHeight"] = scrollHeight; return PartialView("~/Views/Misc/_LogGridPartial.cshtml", logModels); } /// /// Export result for log grid /// [HttpPost] public ActionResult ExportPartialLogs(GridViewExportFormat exportformat) { if (exportformat == null || String.IsNullOrEmpty(exportformat.Format)) return new EmptyResult(); var logs = _logger.GetAllLogs(); var logModels = logs .Select(u => LogDataModel.FromLog(u, false)) .ToList(); var viewContext = new ViewContext(); var viewPage = new ViewPage(); var htmlHelper = new HtmlHelper(viewContext, viewPage); var gridViewSettings = Extensions.GridViewSettingsHelper.LogGridViewSettings(htmlHelper); switch (exportformat.Format.ToLower()) { case "xlsx": return GridViewExtension.ExportToXlsx(gridViewSettings, logModels); case "xls": return GridViewExtension.ExportToXls(gridViewSettings, logModels); case "pdf": return GridViewExtension.ExportToPdf(gridViewSettings, logModels); default: return new EmptyResult(); } } /// /// Partial edit for editing of existing or for new log /// /// Id for existing log, otherweise -1. public ActionResult ViewLog(int id = -1) { var log = _logger.GetLogById(id); var logModel = LogDataModel.FromLog(log, true); return PartialView("~/Views/Misc/_LogViewPartial.cshtml", logModel); } /// /// Simple JSON result for deleting a specific log /// /// Log id. [HttpPost] public ActionResult DeleteLog(int id) { try { var log = _logger.GetLogById(id); if (log != null) _logger.DeleteLog(log); return new JsonResult { Data = "success" }; } catch (Exception ex) { _logger.Error("Fehler bei Löschung eines Logs.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } #endregion } }