SiteController.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. using DevExpress.Utils;
  2. using DevExpress.Web;
  3. using DevExpress.Web.ASPxThemes;
  4. using DevExpress.Web.Mvc;
  5. using DevExpress.XtraPrinting;
  6. using GreenTree.Nachtragsmanagement.Core.Authentication;
  7. using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
  8. using GreenTree.Nachtragsmanagement.Core.Domain.User;
  9. using GreenTree.Nachtragsmanagement.Services.Appendix;
  10. using GreenTree.Nachtragsmanagement.Services.Configuration;
  11. using GreenTree.Nachtragsmanagement.Services.Deviation;
  12. using GreenTree.Nachtragsmanagement.Services.Logging;
  13. using GreenTree.Nachtragsmanagement.Services.Site;
  14. using GreenTree.Nachtragsmanagement.Services.User;
  15. using GreenTree.Nachtragsmanagement.Web.Extensions;
  16. using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
  17. using GreenTree.Nachtragsmanagement.Web.Models.Global;
  18. using GreenTree.Nachtragsmanagement.Web.Models.Site;
  19. using Newtonsoft.Json;
  20. using System;
  21. using System.Collections.Generic;
  22. using System.IO;
  23. using System.Linq;
  24. using System.Net.Mime;
  25. using System.Web;
  26. using System.Web.Mvc;
  27. using System.Web.UI;
  28. using System.Web.UI.WebControls;
  29. using static GreenTree.Nachtragsmanagement.Web.Extensions.MVCxGridViewGeneratorHelper;
  30. namespace GreenTree.Nachtragsmanagement.Web.Controllers
  31. {
  32. public class SiteController : Controller
  33. {
  34. private readonly ISiteService _siteService;
  35. private readonly IDeviationService _deviationService;
  36. private readonly IAppendixService _appendixService;
  37. private readonly IUserService _userService;
  38. private readonly IUserHelper _userHelper;
  39. private readonly ILogger _logger;
  40. private readonly IConfigurationService _configurationService;
  41. public SiteController(
  42. ISiteService siteService,
  43. IDeviationService deviationService,
  44. IAppendixService appendixService,
  45. IUserService userService,
  46. IUserHelper userHelper,
  47. ILogger logger,
  48. IConfigurationService configurationService)
  49. {
  50. _siteService = siteService;
  51. _deviationService = deviationService;
  52. _appendixService = appendixService;
  53. _userService = userService;
  54. _userHelper = userHelper;
  55. _logger = logger;
  56. _configurationService = configurationService;
  57. ViewData["AllUsers"] = _userService.GetAllUsers();
  58. ViewData["AllUsersWithRole"] =
  59. _userService.GetAllUsers()
  60. .Select(u => new
  61. {
  62. Id = u.Id,
  63. Description = String.Format("{0} - {1}", u.Lastname,
  64. String.Join(", ", u.Roles
  65. .Select(r => r.Description)))
  66. })
  67. .ToList();
  68. ViewData["DefaultAppendixState"] = _appendixService.GetDefaultState();
  69. }
  70. #region Sites
  71. /// <summary>
  72. /// Basic site view function
  73. /// </summary>
  74. [FunctionAuthorize(true, "Site-Sites")]
  75. public ActionResult ViewSites()
  76. {
  77. var currentUser = _userHelper.FromCookies();
  78. var sites = _siteService.GetAllUserAssignedSites(currentUser);
  79. var siteModels = sites
  80. .Select(u => SiteDataModel.FromSite(u, false, _configurationService))
  81. .ToList();
  82. return View("~/Views/Sites/View.cshtml", siteModels);
  83. }
  84. /// <summary>
  85. /// Get JSON data of specific site
  86. /// </summary>
  87. /// <param name="id">Site id.</param>
  88. public ActionResult GetSite(int id = -1)
  89. {
  90. var site = _siteService.GetSiteById(id);
  91. if (site == null)
  92. return new JsonResult
  93. {
  94. Data = "notFound",
  95. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  96. };
  97. var siteModel = SiteDataModel.FromSite(site, false, _configurationService);
  98. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  99. siteModel.SiteTreeData = siteTreeModel;
  100. return new JsonResult
  101. {
  102. Data = JsonConvert.SerializeObject(siteModel),
  103. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  104. };
  105. }
  106. /// <summary>
  107. /// Callback result for site grid
  108. /// </summary>
  109. /// <param name="scrollHeight">The height of the grid scrollable component.</param>
  110. public ActionResult PartialSites(int scrollHeight = -1)
  111. {
  112. var currentUser = _userHelper.FromCookies();
  113. var sites = _siteService.GetAllUserAssignedSites(currentUser);
  114. var siteModels = sites
  115. .Select(u => SiteDataModel.FromSite(u, false, _configurationService))
  116. .ToList();
  117. ViewData["ScrollHeight"] = scrollHeight;
  118. return PartialView("~/Views/Sites/_SiteGridPartial.cshtml", siteModels);
  119. }
  120. /// <summary>
  121. /// Export result for site grid
  122. /// </summary>
  123. [HttpPost]
  124. public ActionResult ExportPartialSites(string displayMode, string exportformat)
  125. {
  126. if (String.IsNullOrEmpty(displayMode))
  127. return new EmptyResult();
  128. var currentUser = _userHelper.FromCookies();
  129. var sites = _siteService.GetAllUserAssignedSites(currentUser);
  130. var siteModels = sites
  131. .Select(u => SiteDataModel.FromSite(u, false, _configurationService))
  132. .ToList();
  133. var viewContext = new ViewContext();
  134. var viewPage = new ViewPage();
  135. var htmlHelper = new System.Web.Mvc.HtmlHelper(viewContext, viewPage);
  136. MVCxGridViewState gridViewState = (MVCxGridViewState)Session["SiteGridViewState"];
  137. var settings = GridViewSettingsHelper.SiteGridViewSettings(htmlHelper);
  138. if (gridViewState != null)
  139. {
  140. var generator = new MVCReportGeneratonHelper();
  141. generator.CustomizeColumnsCollection += new CustomizeColumnsCollectionEventHandler(generator_CustomizeColumnsCollection);
  142. generator.CustomizeGroupColumnSummary += new CustomizeColumnGroupSummaryEventHandler(generator_CustomizeGroupColumnSummary);
  143. generator.CustomizeTotalColumnSummary += new CustomizeColumnTotalSummaryEventHandler(generator_CustomizeTotalColumnSummary);
  144. var report = generator.GenerateMVCReport(gridViewState, siteModels, "Baustellenliste");
  145. if (displayMode == "popup")
  146. {
  147. return PartialView("~/Views/Shared/_PrintPopupPartial.cshtml",
  148. new PrintGridModel(report, "devGridViewSite",
  149. new { Controller = "Site", Action = "ExportPartialSites",
  150. displayMode = "callback", exportformat = String.Empty },
  151. new { Controller = "Site", Action = "ExportPartialSites",
  152. displayMode = "export", exportformat = String.Empty }));
  153. }
  154. else if (displayMode == "callback")
  155. {
  156. return PartialView("~/Views/Shared/_PrintDocumentViewerPartial.cshtml",
  157. new PrintGridModel(report, "devGridViewSite",
  158. new { Controller = "Site", Action = "ExportPartialSites",
  159. displayMode = "callback", exportformat = String.Empty },
  160. new { Controller = "Site", Action = "ExportPartialSites",
  161. displayMode = "export", exportformat = String.Empty }));
  162. }
  163. else if (displayMode == "export")
  164. {
  165. switch (exportformat.ToLower())
  166. {
  167. case "xlsx":
  168. settings.TotalSummary["DeviationValue"].DisplayFormat = "{0:c2}";
  169. settings.TotalSummary["Description"].DisplayFormat = "Anzahl = {0:n0}";
  170. return GridViewExtension.ExportToXlsx(settings, siteModels);
  171. case "xls":
  172. settings.TotalSummary["DeviationValue"].DisplayFormat = "{0:c2}";
  173. settings.TotalSummary["Description"].DisplayFormat = "Anzahl = {0:n0}";
  174. return GridViewExtension.ExportToXls(settings, siteModels);
  175. case "pdf":
  176. report.Name = "Baustellenliste";
  177. return DocumentViewerExtension.ExportTo(report);
  178. }
  179. }
  180. return new EmptyResult();
  181. }
  182. else
  183. return new EmptyResult();
  184. }
  185. /// <summary>
  186. /// Customize created columns
  187. /// </summary>
  188. private void generator_CustomizeColumnsCollection(object source, ColumnsCreationEventArgs e)
  189. {
  190. foreach (var column in e.ColumnsInfo)
  191. {
  192. if (column.ColumnCaption == "#") { column.IsVisible = false; }
  193. if (column.FieldName == "CustomNumber") { column.ColumnWidth = 60; }
  194. if (column.FieldName == "SiteDescription") { column.ColumnWidth = 80; }
  195. if (column.FieldName == "Start") { column.ColumnWidth = 65; }
  196. if (column.FieldName == "End") { column.ColumnWidth = 65; }
  197. if (column.FieldName == "AppendixDescription") { column.ColumnWidth = 60; }
  198. if (column.FieldName == "DeviationValue") { column.ColumnWidth = 70; }
  199. if (column.FieldName == "UserDescription") { column.ColumnWidth = 120; }
  200. if (column.FieldName == "Comment") { column.IsVisible = false; column.IsDetail = true; }
  201. }
  202. }
  203. /// <summary>
  204. /// Customize column summary
  205. /// </summary>
  206. private void generator_CustomizeGroupColumnSummary(object source, ColumnSummaryCreationEventArgs e)
  207. {
  208. if (e.FieldName == "DeviationValue") { e.Summary.FormatString = "VA-Wert ∑ = {0:c2}"; }
  209. if (e.FieldName == "Description") { e.Summary.FormatString = "Alle = {0:n0}"; }
  210. }
  211. /// <summary>
  212. /// Customize column summary
  213. /// </summary>
  214. private void generator_CustomizeTotalColumnSummary(object source, ColumnSummaryCreationEventArgs e)
  215. {
  216. if (e.FieldName == "DeviationValue") { e.Summary.FormatString = "{0:c2}"; }
  217. if (e.FieldName == "Description") { e.Summary.FormatString = "Alle = {0:n0}"; }
  218. }
  219. /// <summary>
  220. /// Callback result for site appendices
  221. /// </summary>
  222. /// <param name="siteId">Id of site.</param>
  223. public ActionResult PartialDeviationAppendices(int siteId)
  224. {
  225. var site = _siteService.GetSiteById(siteId);
  226. var siteModel = SiteDataModel.FromSite(site, false, _configurationService);
  227. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  228. siteModel.SiteTreeData = siteTreeModel;
  229. return PartialView("~/Views/Sites/_SiteEditTreePartial.cshtml", siteModel);
  230. }
  231. /// <summary>
  232. /// Partial edit for editing of existing or for new site
  233. /// </summary>
  234. /// <param name="id">Id for existing site, otherweise -1.</param>
  235. public ActionResult EditSite(int id = -1)
  236. {
  237. var site = _siteService.GetSiteById(id);
  238. var siteModel = SiteDataModel.FromSite(site, true, _configurationService);
  239. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  240. siteModel.SiteTreeData = siteTreeModel;
  241. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  242. }
  243. /// <summary>
  244. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  245. /// </summary>
  246. /// <param name="siteModel">Site model to be saved.</param>
  247. [HttpPost, ValidateInput(false)]
  248. public ActionResult EditSite(SiteDataModel siteModel)
  249. {
  250. try
  251. {
  252. if (!ModelState.IsValid)
  253. {
  254. foreach (var role in siteModel.UserValues)
  255. siteModel.UserDescriptions.Add(
  256. ((IList<User>)ViewData["AllUsers"])
  257. .First(r => r.Id == role).Lastname);
  258. if (siteModel.Id != -1)
  259. {
  260. var site = _siteService.GetSiteById(siteModel.Id);
  261. var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
  262. siteModel.SiteTreeData = siteTreeModel;
  263. }
  264. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  265. }
  266. var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray());
  267. if (siteModel.Id == -1)
  268. {
  269. var site = siteModel.ToSite();
  270. site.SetUsers(selectedUsers);
  271. _siteService.InsertSite(site);
  272. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  273. }
  274. else
  275. {
  276. var site = _siteService.GetSiteById(siteModel.Id);
  277. site.CustomNumber = siteModel.CustomNumber;
  278. site.Description = siteModel.Description;
  279. site.Start = siteModel.Start;
  280. site.End = siteModel.End;
  281. site.Comment = siteModel.Comment;
  282. site.SetUsers(selectedUsers);
  283. _siteService.UpdateSite(site);
  284. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  285. }
  286. return new JsonResult
  287. {
  288. Data = "success"
  289. };
  290. }
  291. catch (Exception ex)
  292. {
  293. _logger.Error("Fehler bei Speicherung einer Baustelle.", ex, _userHelper.FromCookies());
  294. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  295. }
  296. }
  297. /// <summary>
  298. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  299. /// </summary>
  300. /// <param name="siteModel">Site model to be saved.</param>
  301. [HttpPost, ValidateInput(false)]
  302. public ActionResult EditSiteForAppend(SiteDataModel siteModel)
  303. {
  304. try
  305. {
  306. if (!ModelState.IsValid)
  307. {
  308. foreach (var role in siteModel.UserValues)
  309. siteModel.UserDescriptions.Add(
  310. ((IList<User>)ViewData["AllUsers"])
  311. .First(r => r.Id == role).Lastname);
  312. return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
  313. }
  314. var selectedUsers = _userService.GetUsersByIds(siteModel.UserValues.ToArray());
  315. var siteId = siteModel.Id;
  316. if (siteModel.Id == -1)
  317. {
  318. var site = siteModel.ToSite();
  319. site.SetUsers(selectedUsers);
  320. _siteService.InsertSite(site);
  321. siteId = site.Id;
  322. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  323. }
  324. return EditSite(siteId);
  325. }
  326. catch (Exception ex)
  327. {
  328. _logger.Error("Fehler bei Speicherung einer Baustelle für einen Nachtrag.", ex, _userHelper.FromCookies());
  329. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  330. }
  331. }
  332. /// <summary>
  333. /// Simple JSON result for deleting a specific site
  334. /// </summary>
  335. /// <param name="id">Site id.</param>
  336. [HttpPost]
  337. public ActionResult DeleteSite(int id)
  338. {
  339. try
  340. {
  341. var site = _siteService.GetSiteById(id);
  342. if (site != null)
  343. _siteService.DeleteSite(site);
  344. _logger.Entity(site, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  345. return new JsonResult
  346. {
  347. Data = "success"
  348. };
  349. }
  350. catch (Exception ex)
  351. {
  352. _logger.Error("Fehler bei Löschung einer Baustelle.", ex, _userHelper.FromCookies());
  353. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  354. }
  355. }
  356. #endregion
  357. #region Assigning
  358. /// <summary>
  359. /// Assigns a deviation to an existing entity of type site or appendix
  360. /// </summary>
  361. /// <param name="siteId">The siteId in which the context works.</param>
  362. /// <param name="sourceKey">The sourceKey of the deviation.</param>
  363. /// <param name="targetKey">The targetKey of the site or appendix.</param>
  364. public ActionResult AssignDeviationToEntity(int siteId, string sourceKey, string targetKey)
  365. {
  366. if (!sourceKey.StartsWith("d"))
  367. return new EmptyResult();
  368. if (sourceKey == targetKey)
  369. return new EmptyResult();
  370. var determinedTargetKey = targetKey;
  371. if (targetKey.StartsWith("d"))
  372. {
  373. return new EmptyResult();
  374. //var targetDeviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty));
  375. //var targetDeviation = _deviationService.GetDeviationById(targetDeviationId);
  376. //if (targetDeviation == null)
  377. // return new EmptyResult();
  378. //if (targetDeviation.Site != null)
  379. // determinedTargetKey = "a_0";
  380. //if (targetDeviation.Appendix != null)
  381. // determinedTargetKey = String.Format("a_{0}", targetDeviation.AppendixId);
  382. }
  383. var deviationId = Convert.ToInt32(sourceKey.Replace("d_", String.Empty));
  384. var deviation = _deviationService.GetDeviationById(deviationId);
  385. if (determinedTargetKey == "a_0")
  386. {
  387. try
  388. {
  389. var site = _siteService.GetSiteById(siteId);
  390. if (deviation.Site != null)
  391. return new EmptyResult();
  392. deviation.Appendix = null;
  393. deviation.AppendixId = null;
  394. site.Deviations.Add(deviation);
  395. _siteService.UpdateSite(site);
  396. _deviationService.UpdateDeviation(deviation);
  397. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  398. }
  399. catch (Exception ex)
  400. {
  401. _logger.Error("Fehler bei Zuweisung einer VA zu einer Baustelle.", ex, _userHelper.FromCookies());
  402. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  403. }
  404. }
  405. else
  406. {
  407. try
  408. {
  409. var appendixId = Convert.ToInt32(determinedTargetKey.Replace("a_", String.Empty));
  410. var appendix = _appendixService.GetAppendixById(appendixId);
  411. if (deviation.AppendixId == appendixId)
  412. return new EmptyResult();
  413. deviation.Site = null;
  414. deviation.SiteId = null;
  415. appendix.Deviations.Add(deviation);
  416. _appendixService.UpdateAppendix(appendix);
  417. _deviationService.UpdateDeviation(deviation);
  418. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  419. }
  420. catch (Exception ex)
  421. {
  422. _logger.Error("Fehler bei Zuweisung einer VA zu einem Nachtrag.", ex, _userHelper.FromCookies());
  423. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  424. }
  425. }
  426. return new JsonResult
  427. {
  428. Data = "success"
  429. };
  430. }
  431. #endregion
  432. }
  433. }