using DevExpress.Utils; using DevExpress.Web; using DevExpress.Web.ASPxThemes; using DevExpress.Web.Mvc; using DevExpress.XtraPrinting; 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.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; public MiscController( IMiscService miscService, IUserService userService, INotificationService notificationService, INotificationScheduler notificationScheduler) { _miscService = miscService; _userService = userService; _notificationService = notificationService; _notificationScheduler = notificationScheduler; 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) { 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.Insert(0, "0 "); var selectedUsers = _userService.GetUsersByIds(mailNotificationModel.UserValues.ToArray()); if (mailNotificationModel.Id == -1) { var mailNotification = mailNotificationModel.ToMailNotification(); mailNotification.SetUsers(selectedUsers); _miscService.InsertMailNotification(mailNotification); } 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); } _notificationScheduler.Start(); return new JsonResult { Data = "success" }; } /// /// Simple JSON result for deleting a specific mailNotification /// /// MailNotification id. [HttpPost] public ActionResult DeleteMailNotification(int id) { var mailNotification = _miscService.GetMailNotificationById(id); if (mailNotification != null) _miscService.DeleteMailNotification(mailNotification); return new JsonResult { Data = "success" }; } /// /// Processes the specific mailNotification /// /// MailNotification id. [HttpPost] public ActionResult ProcessMailNotification(int id) { var mailNotification = _miscService.GetMailNotificationById(id); if (mailNotification != null) { var notificationPlugin = _notificationService.GetNotificationPlugin(mailNotification.NotificationPluginSystemName); notificationPlugin.ProcessNotifications(new[] { mailNotification }); } return new JsonResult { Data = "success" }; } #endregion } }