using DevExpress.Utils; using DevExpress.Web; using DevExpress.Web.ASPxThemes; using DevExpress.Web.Mvc; using DevExpress.XtraPrinting; 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.Site; using GreenTree.Nachtragsmanagement.Services.User; using GreenTree.Nachtragsmanagement.Web.Framework.Authorization; using GreenTree.Nachtragsmanagement.Web.Models.Global; using GreenTree.Nachtragsmanagement.Web.Models.Site; 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 SiteController : Controller { private readonly ISiteService _siteService; private readonly IDeviationService _deviationService; private readonly IAppendixService _appendixService; private readonly IUserService _userService; private readonly IUserHelper _userHelper; private readonly ILogger _logger; public SiteController( ISiteService siteService, IDeviationService deviationService, IAppendixService appendixService, IUserService userService, IUserHelper userHelper, ILogger logger) { _siteService = siteService; _deviationService = deviationService; _appendixService = appendixService; _userService = userService; _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["DefaultAppendixState"] = _appendixService.GetDefaultState(); } #region Sites /// /// Basic site view function /// [FunctionAuthorize(true, "Site-Sites")] public ActionResult ViewSites() { var currentUser = _userHelper.FromCookies(); var sites = _siteService.GetAllUserAssignedSites(currentUser); var siteModels = sites .Select(u => SiteDataModel.FromSite(u, false)) .ToList(); return View("~/Views/Sites/View.cshtml", siteModels); } /// /// Get JSON data of specific site /// /// Site id. public ActionResult GetSite(int id = -1) { var site = _siteService.GetSiteById(id); if (site == null) return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet }; var siteModel = SiteDataModel.FromSite(site, false); var siteTreeModel = SiteTreeDataModel.TreeFromSite(site); siteModel.SiteTreeData = siteTreeModel; return new JsonResult { Data = JsonConvert.SerializeObject(siteModel), JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } /// /// Callback result for site grid /// /// The height of the grid scrollable component. public ActionResult PartialSites(int scrollHeight = -1) { var currentUser = _userHelper.FromCookies(); var sites = _siteService.GetAllUserAssignedSites(currentUser); var siteModels = sites .Select(u => SiteDataModel.FromSite(u, false)) .ToList(); ViewData["ScrollHeight"] = scrollHeight; return PartialView("~/Views/Sites/_SiteGridPartial.cshtml", siteModels); } /// /// Export result for site grid /// [HttpPost] public ActionResult ExportPartialSites(GridViewExportFormat exportformat) { if (exportformat == null || String.IsNullOrEmpty(exportformat.Format)) return new EmptyResult(); var currentUser = _userHelper.FromCookies(); var sites = _siteService.GetAllUserAssignedSites(currentUser); var siteModels = sites .Select(u => SiteDataModel.FromSite(u, false)) .ToList(); var viewContext = new ViewContext(); var viewPage = new ViewPage(); var htmlHelper = new HtmlHelper(viewContext, viewPage); var gridViewSettings = Extensions.GridViewSettingsHelper.SiteGridViewSettings(htmlHelper); switch (exportformat.Format.ToLower()) { case "xlsx": return GridViewExtension.ExportToXlsx(gridViewSettings, siteModels); case "xls": return GridViewExtension.ExportToXls(gridViewSettings, siteModels); case "pdf": return GridViewExtension.ExportToPdf(gridViewSettings, siteModels); default: return new EmptyResult(); } } /// /// Callback result for site appendices /// /// Id of site. public ActionResult PartialDeviationAppendices(int siteId) { var site = _siteService.GetSiteById(siteId); var siteModel = SiteDataModel.FromSite(site, false); var siteTreeModel = SiteTreeDataModel.TreeFromSite(site); siteModel.SiteTreeData = siteTreeModel; return PartialView("~/Views/Sites/_SiteEditTreePartial.cshtml", siteModel); } /// /// Partial edit for editing of existing or for new site /// /// Id for existing site, otherweise -1. public ActionResult EditSite(int id = -1) { var site = _siteService.GetSiteById(id); var siteModel = SiteDataModel.FromSite(site, true); var siteTreeModel = SiteTreeDataModel.TreeFromSite(site); siteModel.SiteTreeData = siteTreeModel; return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel); } /// /// Partial edit result if ModelState is valid, otherwise simple JSON result for success /// /// Site model to be saved. [HttpPost, ValidateInput(false)] public ActionResult EditSite(SiteDataModel siteModel) { try { if (!ModelState.IsValid) { foreach (var role in siteModel.UserValues) siteModel.UserDescriptions.Add( ((IList)ViewData["AllUsers"]) .First(r => r.Id == role).Lastname); if (siteModel.Id != -1) { var site = _siteService.GetSiteById(siteModel.Id); var siteTreeModel = SiteTreeDataModel.TreeFromSite(site); siteModel.SiteTreeData = siteTreeModel; } return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel); } var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray()); if (siteModel.Id == -1) { var site = siteModel.ToSite(); site.SetUsers(selectedUsers); _siteService.InsertSite(site); _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies()); } else { var site = _siteService.GetSiteById(siteModel.Id); site.CustomNumber = siteModel.CustomNumber; site.Description = siteModel.Description; site.Start = siteModel.Start; site.End = siteModel.End; site.Comment = siteModel.Comment; site.SetUsers(selectedUsers); _siteService.UpdateSite(site); _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies()); } return new JsonResult { Data = "success" }; } catch (Exception ex) { _logger.Error("Fehler bei Speicherung einer Baustelle.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } /// /// Partial edit result if ModelState is valid, otherwise simple JSON result for success /// /// Site model to be saved. [HttpPost, ValidateInput(false)] public ActionResult EditSiteForAppend(SiteDataModel siteModel) { try { if (!ModelState.IsValid) { foreach (var role in siteModel.UserValues) siteModel.UserDescriptions.Add( ((IList)ViewData["AllUsers"]) .First(r => r.Id == role).Lastname); return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel); } var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray()); var siteId = siteModel.Id; if (siteModel.Id == -1) { var site = siteModel.ToSite(); site.SetUsers(selectedUsers); _siteService.InsertSite(site); siteId = site.Id; _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies()); } return EditSite(siteId); } catch (Exception ex) { _logger.Error("Fehler bei Speicherung einer Baustelle für einen Nachtrag.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } /// /// Simple JSON result for deleting a specific site /// /// Site id. [HttpPost] public ActionResult DeleteSite(int id) { try { var site = _siteService.GetSiteById(id); if (site != null) _siteService.DeleteSite(site); _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies()); return new JsonResult { Data = "success" }; } catch (Exception ex) { _logger.Error("Fehler bei Löschung einer Baustelle.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } #endregion #region Assigning /// /// Assigns a deviation to an existing entity of type site or appendix /// /// The siteId in which the context works. /// The sourceKey of the deviation. /// The targetKey of the site or appendix. public ActionResult AssignDeviationToEntity(int siteId, string sourceKey, string targetKey) { if (!sourceKey.StartsWith("d")) return new EmptyResult(); if (sourceKey == targetKey) return new EmptyResult(); var determinedTargetKey = targetKey; if (targetKey.StartsWith("d")) { return new EmptyResult(); //var targetDeviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty)); //var targetDeviation = _deviationService.GetDeviationById(targetDeviationId); //if (targetDeviation == null) // return new EmptyResult(); //if (targetDeviation.Site != null) // determinedTargetKey = "a_0"; //if (targetDeviation.Appendix != null) // determinedTargetKey = String.Format("a_{0}", targetDeviation.AppendixId); } var deviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty)); var deviation = _deviationService.GetDeviationById(deviationId); if (determinedTargetKey == "a_0") { try { var site = _siteService.GetSiteById(siteId); if (deviation.Site != null) return new EmptyResult(); deviation.Appendix = null; deviation.AppendixId = null; site.Deviations.Add(deviation); _siteService.UpdateSite(site); _deviationService.UpdateDeviation(deviation); _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies()); } catch (Exception ex) { _logger.Error("Fehler bei Zuweisung einer VA zu einer Baustelle.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } else { try { var appendixId = Convert.ToInt32(determinedTargetKey.Replace("a_", String.Empty)); var appendix = _appendixService.GetAppendixById(appendixId); if (deviation.AppendixId == appendixId) return new EmptyResult(); deviation.Site = null; deviation.SiteId = null; appendix.Deviations.Add(deviation); _appendixService.UpdateAppendix(appendix); _deviationService.UpdateDeviation(deviation); _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies()); } catch (Exception ex) { _logger.Error("Fehler bei Zuweisung einer VA zu einem Nachtrag.", ex, _userHelper.FromCookies()); return PartialView("~/Views/Shared/_PopupError.cshtml", ex); } } return new JsonResult { Data = "success" }; } #endregion } }