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.Extensions; 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.Net.Mime; using System.Web; using System.Web.Mvc; using System.Web.UI; using System.Web.UI.WebControls; using static GreenTree.Nachtragsmanagement.Web.Extensions.MVCxGridViewGeneratorHelper; 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(string displayMode, string exportformat) { if (String.IsNullOrEmpty(displayMode)) 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 System.Web.Mvc.HtmlHelper(viewContext, viewPage); MVCxGridViewState gridViewState = (MVCxGridViewState)Session["SiteGridViewState"]; var settings = GridViewSettingsHelper.SiteGridViewSettings(htmlHelper); if (gridViewState != null) { var generator = new MVCReportGeneratonHelper(); generator.CustomizeColumnsCollection += new CustomizeColumnsCollectionEventHandler(generator_CustomizeColumnsCollection); generator.CustomizeGroupColumnSummary += new CustomizeColumnGroupSummaryEventHandler(generator_CustomizeGroupColumnSummary); generator.CustomizeTotalColumnSummary += new CustomizeColumnTotalSummaryEventHandler(generator_CustomizeTotalColumnSummary); var report = generator.GenerateMVCReport(gridViewState, siteModels, "Baustellenliste"); if (displayMode == "popup") return PartialView("~/Views/Shared/_PrintPopupPartial.cshtml", new PrintGridModel(report, "Site", "ExportPartialSites", "devGridViewSite")); else if (displayMode == "callback") return PartialView("~/Views/Shared/_PrintDocumentViewerPartial.cshtml", new PrintGridModel(report, "Site", "ExportPartialSites", "devGridViewSite")); else if (displayMode == "export") { switch (exportformat.ToLower()) { case "xlsx": settings.TotalSummary["DeviationValue"].DisplayFormat = "{0:c2}"; settings.TotalSummary["Description"].DisplayFormat = "Anzahl = {0:n0}"; return GridViewExtension.ExportToXlsx(settings, siteModels); case "xls": settings.TotalSummary["DeviationValue"].DisplayFormat = "{0:c2}"; settings.TotalSummary["Description"].DisplayFormat = "Anzahl = {0:n0}"; return GridViewExtension.ExportToXls(settings, siteModels); case "pdf": report.Name = "Baustellenliste"; return DocumentViewerExtension.ExportTo(report); } } return new EmptyResult(); } else return new EmptyResult(); } /// /// Customize created columns /// private void generator_CustomizeColumnsCollection(object source, ColumnsCreationEventArgs e) { foreach (var column in e.ColumnsInfo) { if (column.ColumnCaption == "#") { column.IsVisible = false; } if (column.FieldName == "CustomNumber") { column.ColumnWidth = 60; } if (column.FieldName == "SiteDescription") { column.ColumnWidth = 80; } if (column.FieldName == "Start") { column.ColumnWidth = 65; } if (column.FieldName == "End") { column.ColumnWidth = 65; } if (column.FieldName == "AppendixDescription") { column.ColumnWidth = 60; } if (column.FieldName == "DeviationValue") { column.ColumnWidth = 70; } if (column.FieldName == "UserDescription") { column.ColumnWidth = 120; } if (column.FieldName == "Comment") { column.IsVisible = false; column.IsDetail = true; } } } /// /// Customize column summary /// private void generator_CustomizeGroupColumnSummary(object source, ColumnSummaryCreationEventArgs e) { if (e.FieldName == "DeviationValue") { e.Summary.FormatString = "VA-Wert ∑ = {0:c2}"; } if (e.FieldName == "Description") { e.Summary.FormatString = "Alle = {0:n0}"; } } /// /// Customize column summary /// private void generator_CustomizeTotalColumnSummary(object source, ColumnSummaryCreationEventArgs e) { if (e.FieldName == "DeviationValue") { e.Summary.FormatString = "{0:c2}"; } if (e.FieldName == "Description") { e.Summary.FormatString = "Alle = {0:n0}"; } } /// /// 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 } }