DeviationController.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. using DevExpress.Web.Mvc;
  2. using DevExpress.XtraReports.UI;
  3. using GreenTree.Nachtragsmanagement.Core;
  4. using GreenTree.Nachtragsmanagement.Core.Authentication;
  5. using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
  6. using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
  7. using GreenTree.Nachtragsmanagement.Services.Appendix;
  8. using GreenTree.Nachtragsmanagement.Services.Configuration;
  9. using GreenTree.Nachtragsmanagement.Services.Deviation;
  10. using GreenTree.Nachtragsmanagement.Services.Logging;
  11. using GreenTree.Nachtragsmanagement.Services.Site;
  12. using GreenTree.Nachtragsmanagement.Web.Extensions;
  13. using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
  14. using GreenTree.Nachtragsmanagement.Web.Models.Appendix;
  15. using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
  16. using GreenTree.Nachtragsmanagement.Web.Models.Global;
  17. using Newtonsoft.Json;
  18. using Newtonsoft.Json.Linq;
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Drawing;
  22. using System.Linq;
  23. using System.Net.Mime;
  24. using System.Web;
  25. using System.Web.Mvc;
  26. using static GreenTree.Nachtragsmanagement.Web.Extensions.MVCxGridViewGeneratorHelper;
  27. namespace GreenTree.Nachtragsmanagement.Web.Controllers
  28. {
  29. public class DeviationController : Controller
  30. {
  31. private readonly IDeviationService _deviationService;
  32. private readonly IAppendixService _appendixService;
  33. private readonly ISiteService _siteService;
  34. private readonly IUserHelper _userHelper;
  35. private readonly ILogger _logger;
  36. private readonly IConfigurationService _configurationService;
  37. public DeviationController(
  38. IDeviationService deviationService,
  39. IAppendixService appendixService,
  40. ISiteService siteService,
  41. IUserHelper userHelper,
  42. ILogger logger,
  43. IConfigurationService configurationService)
  44. {
  45. _deviationService = deviationService;
  46. _appendixService = appendixService;
  47. _siteService = siteService;
  48. _userHelper = userHelper;
  49. _logger = logger;
  50. _configurationService = configurationService;
  51. ViewData["AllDisturbances"] = _deviationService.GetAllDisturbances();
  52. ViewData["AllStatuses"] = _deviationService.GetAllStatuses();
  53. ViewData["AllKinds"] = _deviationService.GetAllKinds();
  54. }
  55. #region Deviations
  56. /// <summary>
  57. /// Basic deviation view function
  58. /// </summary>
  59. [FunctionAuthorize(true, "Deviation-Deviations")]
  60. public ActionResult ViewDeviations()
  61. {
  62. var currentUser = _userHelper.FromCookies();
  63. var deviations = _deviationService.GetAllUserAssignedDeviations(currentUser);
  64. var deviationModels = deviations
  65. .Select(u => DeviationDataModel.FromDeviation(u, false, _configurationService))
  66. .ToList();
  67. return View("~/Views/Deviations/View.cshtml", deviationModels);
  68. }
  69. /// <summary>
  70. /// Get JSON data of specific deviation
  71. /// </summary>
  72. /// <param name="id">Deviation id.</param>
  73. public ActionResult GetDeviation(int id = -1)
  74. {
  75. var deviation = _deviationService.GetDeviationById(id);
  76. if (deviation == null)
  77. return new JsonResult
  78. {
  79. Data = "notFound",
  80. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  81. };
  82. var deviationModel = DeviationDataModel.FromDeviation(deviation, false, _configurationService);
  83. return new JsonResult
  84. {
  85. Data = JsonConvert.SerializeObject(deviationModel),
  86. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  87. };
  88. }
  89. /// <summary>
  90. /// Callback result for deviation grid
  91. /// </summary>
  92. /// <param name="scrollHeight">The height of the grid scrollable component.</param>
  93. public ActionResult PartialDeviations(string customFilters, int scrollHeight = -1)
  94. {
  95. var currentUser = _userHelper.FromCookies();
  96. var deviations = _deviationService.GetAllUserAssignedDeviations(currentUser);
  97. var deviationModels = deviations
  98. .Select(u => DeviationDataModel.FromDeviation(u, false, _configurationService))
  99. .ToList();
  100. if (!String.IsNullOrEmpty(customFilters))
  101. UseCustomFilters(customFilters, deviationModels);
  102. ViewData["ScrollHeight"] = scrollHeight;
  103. return PartialView("~/Views/Deviations/_DeviationGridPartial.cshtml", deviationModels);
  104. }
  105. /// <summary>
  106. /// Export result for deviation grid
  107. /// </summary>
  108. [HttpPost]
  109. public ActionResult ExportPartialDeviations(string customFilters, string displayMode, string exportformat)
  110. {
  111. if (String.IsNullOrEmpty(displayMode))
  112. return new EmptyResult();
  113. var currentUser = _userHelper.FromCookies();
  114. var deviations = _deviationService.GetAllUserAssignedDeviations(currentUser);
  115. var deviationModels = deviations
  116. .Select(u => DeviationDataModel.FromDeviation(u, false, _configurationService))
  117. .ToList();
  118. if (!String.IsNullOrEmpty(customFilters))
  119. UseCustomFilters(customFilters, deviationModels);
  120. var viewContext = new ViewContext();
  121. var viewPage = new ViewPage();
  122. var htmlHelper = new System.Web.Mvc.HtmlHelper(viewContext, viewPage);
  123. MVCxGridViewState gridViewState = (MVCxGridViewState)Session["DeviationGridViewState"];
  124. var settings = GridViewSettingsHelper.DeviationGridViewSettings(htmlHelper);
  125. if (gridViewState != null)
  126. {
  127. var generator = new MVCReportGeneratonHelper();
  128. generator.CustomizeFormattingRules += new CustomizeFormattingRulesEventHandler(generator_CustomizeFormattingRules);
  129. generator.CustomizeColumnsCollection += new CustomizeColumnsCollectionEventHandler(generator_CustomizeColumnsCollection);
  130. generator.CustomizeGroupColumnSummary += new CustomizeColumnGroupSummaryEventHandler(generator_CustomizeGroupColumnSummary);
  131. generator.CustomizeTotalColumnSummary += new CustomizeColumnTotalSummaryEventHandler(generator_CustomizeTotalColumnSummary);
  132. generator.SummaryReset += new SummaryResetEventHandler(generator_SummaryReset);
  133. generator.SummaryRowChanged += new SummaryRowChangedEventHandler(generator_SummaryRowChanged);
  134. generator.PageSummaryGetResult += new SummaryGetResultHandler(generator_PageSummaryGetResult);
  135. generator.TotalSummaryGetResult += new SummaryGetResultHandler(generator_TotalSummaryGetResult);
  136. var report = generator.GenerateMVCReport(gridViewState, deviationModels, "Vertragsabweichungsliste");
  137. if (displayMode == "popup")
  138. {
  139. return PartialView("~/Views/Shared/_PrintPopupPartial.cshtml",
  140. new PrintGridModel(report, "devGridViewDeviation",
  141. new { Controller = "Deviation", Action = "ExportPartialDeviations",
  142. customFilters = customFilters, displayMode = "callback", exportformat = String.Empty },
  143. new { Controller = "Deviation", Action = "ExportPartialDeviations",
  144. customFilters = customFilters, displayMode = "export", exportformat = String.Empty }));
  145. }
  146. else if (displayMode == "callback")
  147. {
  148. return PartialView("~/Views/Shared/_PrintDocumentViewerPartial.cshtml",
  149. new PrintGridModel(report, "devGridViewDeviation",
  150. new { Controller = "Deviation", Action = "ExportPartialDeviations",
  151. customFilters = customFilters, displayMode = "callback", exportformat = String.Empty },
  152. new { Controller = "Deviation", Action = "ExportPartialDeviations",
  153. customFilters = customFilters, displayMode = "export", exportformat = String.Empty }));
  154. }
  155. else if (displayMode == "export")
  156. {
  157. switch (exportformat.ToLower())
  158. {
  159. case "xlsx":
  160. settings.TotalSummary["Value"].DisplayFormat = "{0:c2}";
  161. settings.TotalSummary["Percentage"].DisplayFormat = "{0:p0}";
  162. settings.TotalSummary["PercentageValue"].DisplayFormat = "{0:c2}";
  163. settings.TotalSummary["DaysReceiptToAppendixOffering"].DisplayFormat = "Schnitt = {0:n0}";
  164. settings.TotalSummary["SiteDescription"].DisplayFormat = "Anzahl = {0:n0}";
  165. settings.TotalSummary["DisturbanceValuesDescription"].DisplayFormat = "{0:c2}";
  166. return GridViewExtension.ExportToXlsx(settings, deviationModels);
  167. case "xls":
  168. settings.TotalSummary["Value"].DisplayFormat = "{0:c2}";
  169. settings.TotalSummary["Percentage"].DisplayFormat = "{0:p0}";
  170. settings.TotalSummary["PercentageValue"].DisplayFormat = "{0:c2}";
  171. settings.TotalSummary["DaysReceiptToAppendixOffering"].DisplayFormat = "Schnitt = {0:n0}";
  172. settings.TotalSummary["SiteDescription"].DisplayFormat = "Anzahl = {0:n0}";
  173. settings.TotalSummary["DisturbanceValuesDescription"].DisplayFormat = "{0:c2}";
  174. return GridViewExtension.ExportToXls(settings, deviationModels);
  175. case "pdf":
  176. report.Name = "VA-Liste";
  177. return DocumentViewerExtension.ExportTo(report);
  178. }
  179. }
  180. return new EmptyResult();
  181. }
  182. else
  183. return new EmptyResult();
  184. }
  185. private decimal totalCustomSummaryValueDaysReceiptToAppendixOffering = 0;
  186. private decimal totalCustomSummaryValueDisturbanceValueSum = 0;
  187. private decimal accumulatedCustomSummaryValueDaysReceiptToAppendixOffering = 0;
  188. private decimal accumulatedCustomSummaryValueDisturbanceValueSum = 0;
  189. private decimal accumulatedValue = 0;
  190. private decimal accumulatedCount = 0;
  191. /// <summary>
  192. /// Reset custom summaries for corresponding group type
  193. /// </summary>
  194. /// <param name="source"></param>
  195. /// <param name="e"></param>
  196. private void generator_SummaryReset(object source, CustomSummaryResetEventArgs e)
  197. {
  198. totalCustomSummaryValueDaysReceiptToAppendixOffering = 0;
  199. totalCustomSummaryValueDisturbanceValueSum = 0;
  200. }
  201. /// <summary>
  202. /// Get custom summary values
  203. /// </summary>
  204. /// <param name="source"></param>
  205. /// <param name="e"></param>
  206. private void generator_SummaryRowChanged(object source, CustomSummaryRowChangedEventArgs e)
  207. {
  208. if (e.FieldName == "DaysReceiptToAppendixOffering")
  209. totalCustomSummaryValueDaysReceiptToAppendixOffering +=
  210. Convert.ToDecimal(((XtraReport)source).GetCurrentColumnValue("DaysReceiptToAppendixOffering"));
  211. if (e.FieldName == "DisturbanceValuesDescription")
  212. {
  213. totalCustomSummaryValueDisturbanceValueSum +=
  214. Convert.ToDecimal(((XtraReport)source).GetCurrentColumnValue("DisturbanceValueSum"));
  215. }
  216. }
  217. /// <summary>
  218. /// Set custom summary result for page
  219. /// </summary>
  220. /// <param name="source"></param>
  221. /// <param name="e"></param>
  222. private void generator_PageSummaryGetResult(object source, SummaryGetResultEventArgs e)
  223. {
  224. var label = (XRLabel)source;
  225. if (label.Tag.ToString() == "DaysReceiptToAppendixOffering")
  226. {
  227. accumulatedCustomSummaryValueDaysReceiptToAppendixOffering += e.CalculatedValues.OfType<int>().Sum();
  228. e.Result = accumulatedCustomSummaryValueDaysReceiptToAppendixOffering;
  229. }
  230. if (label.Tag.ToString() == "DisturbanceValueSum")
  231. {
  232. accumulatedCustomSummaryValueDisturbanceValueSum += e.CalculatedValues.OfType<decimal>().Sum();
  233. e.Result = accumulatedCustomSummaryValueDisturbanceValueSum;
  234. }
  235. if (label.Tag.ToString() == "Value")
  236. {
  237. accumulatedValue += e.CalculatedValues.OfType<decimal>().Sum();
  238. e.Result = accumulatedValue;
  239. }
  240. if (label.Tag.ToString() == "SiteDescription")
  241. {
  242. accumulatedCount += e.CalculatedValues.Count;
  243. e.Result = accumulatedCount;
  244. }
  245. e.Handled = true;
  246. }
  247. /// <summary>
  248. /// Set custom summary result for full report
  249. /// </summary>
  250. /// <param name="source"></param>
  251. /// <param name="e"></param>
  252. private void generator_TotalSummaryGetResult(object source, SummaryGetResultEventArgs e)
  253. {
  254. var label = (XRLabel)source;
  255. if (label.Tag.ToString() == "DaysReceiptToAppendixOffering")
  256. e.Result = totalCustomSummaryValueDaysReceiptToAppendixOffering;
  257. if (label.Tag.ToString() == "DisturbanceValuesDescription")
  258. e.Result = totalCustomSummaryValueDisturbanceValueSum;
  259. e.Handled = true;
  260. }
  261. /// <summary>
  262. /// Customize formatting
  263. /// </summary>
  264. /// <param name="source"></param>
  265. /// <param name="e"></param>
  266. private void generator_CustomizeFormattingRules(object source, CustomFormattingRulesEventArgs e)
  267. {
  268. var colorLevel1 = _configurationService.TryGetConfigItemValue<string>(
  269. "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.HexColorLevel1", "#FFD800");
  270. var ageDaysLevel1 = _configurationService.TryGetConfigItemValue<int>(
  271. "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.AgeDaysLevel1", 40);
  272. var colorLevel2 = _configurationService.TryGetConfigItemValue<string>(
  273. "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.HexColorLevel2", "#FF6A00");
  274. var ageDaysLevel2 = _configurationService.TryGetConfigItemValue<int>(
  275. "GreenTree.Nachtragsmanagement.DeviationNotificationPlugin.ProcessDeviationReceipt.AgeDaysLevel2", 60);
  276. var ageDaysLevel1Rule = new FormattingRule
  277. {
  278. Condition = String.Format("[DaysReceiptDateToday] >= {0}", ageDaysLevel1),
  279. Name = "AgeDaysLevel1BackColor"
  280. };
  281. ageDaysLevel1Rule.Formatting.BackColor = ColorTranslator.FromHtml(colorLevel1);
  282. var ageDaysLevel2Rule = new FormattingRule
  283. {
  284. Condition = String.Format("[DaysReceiptDateToday] >= {0}", ageDaysLevel2),
  285. Name = "AgeDaysLevel2BackColor"
  286. };
  287. ageDaysLevel2Rule.Formatting.BackColor = ColorTranslator.FromHtml(colorLevel2);
  288. e.Rules.Add(ageDaysLevel1Rule);
  289. e.Rules.Add(ageDaysLevel2Rule);
  290. }
  291. /// <summary>
  292. /// Customize created columns
  293. /// </summary>
  294. private void generator_CustomizeColumnsCollection(object source, ColumnsCreationEventArgs e)
  295. {
  296. foreach (var column in e.ColumnsInfo)
  297. {
  298. if (column.FieldName == "CustomNumber") { column.ColumnWidth = 30; }
  299. if (column.FieldName == "Description") { column.IsVisible = false; column.IsDetail = true; }
  300. if (column.FieldName == "SiteDescription") { column.ColumnWidth = 60; }
  301. if (column.FieldName == "AppendixDescription") { column.ColumnWidth = 50; }
  302. if (column.FieldName == "StatusDescription") { column.ColumnWidth = 60; }
  303. }
  304. }
  305. /// <summary>
  306. /// Customize column summary
  307. /// </summary>
  308. private void generator_CustomizeGroupColumnSummary(object source, ColumnSummaryCreationEventArgs e)
  309. {
  310. if (e.FieldName == "SiteDescription") { e.Summary.FormatString = "Alle = {0:n0}"; }
  311. if (e.FieldName == "Value") { e.Summary.FormatString = "Schätzung ∑ = {0:c2}"; }
  312. if (e.FieldName == "Percentage") { e.Summary.FormatString = "Bew. Ø = {0:p0}"; }
  313. if (e.FieldName == "PercentageValue") { e.Summary.FormatString = "S. Bew. ∑ = {0:c2}"; }
  314. if (e.FieldName == "DaysReceiptToAppendixOffering") { e.Summary.FormatString = "Tage VA-NT = {0:n0}"; }
  315. if (e.FieldName == "DisturbanceValuesDescription") { e.Summary.FormatString = "Kat. ∑ = {0:c2}"; }
  316. }
  317. /// <summary>
  318. /// Customize column summary
  319. /// </summary>
  320. private void generator_CustomizeTotalColumnSummary(object source, ColumnSummaryCreationEventArgs e)
  321. {
  322. if (e.FieldName == "SiteDescription") { e.Summary.FormatString = "Alle = {0:n0}"; }
  323. if (e.FieldName == "Value") { e.Summary.FormatString = "{0:c2}"; }
  324. if (e.FieldName == "Percentage") { e.Summary.FormatString = "{0:p0}"; }
  325. if (e.FieldName == "PercentageValue") { e.Summary.FormatString = "{0:c2}"; }
  326. if (e.FieldName == "DaysReceiptToAppendixOffering") { e.Summary.FormatString = "{0:n0}"; }
  327. if (e.FieldName == "DisturbanceValuesDescription") { e.Summary.FormatString = "{0:c2}"; }
  328. }
  329. /// <summary>
  330. /// Partial edit for editing of existing or for new deviation
  331. /// </summary>
  332. /// <param name="id">Id for existing deviation, otherweise -1.</param>
  333. public ActionResult EditDeviation(int id = -1)
  334. {
  335. var deviation = _deviationService.GetDeviationById(id);
  336. var deviationModel = DeviationDataModel.FromDeviation(deviation, true, _configurationService);
  337. var defaultKind = _deviationService.GetDefaultKind();
  338. var defaultStatus = _deviationService.GetDefaultStatus();
  339. if (defaultKind != null)
  340. ViewData["DefaultKind"] = defaultKind.Id;
  341. if (defaultStatus != null)
  342. ViewData["DefaultStatus"] = defaultStatus.Id;
  343. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  344. }
  345. /// <summary>
  346. /// Partial edit for creating a new deviation for a site
  347. /// </summary>
  348. /// <param name="siteId">Id of the site which the deviation should be appended to.</param>
  349. public ActionResult AppendDeviationToSite(int siteId)
  350. {
  351. var site = _siteService.GetSiteById(siteId);
  352. var allDeviations = new List<Deviation>();
  353. allDeviations.AddRange(
  354. site.Appendices
  355. .SelectMany(a => a.Deviations));
  356. allDeviations.AddRange(
  357. site.Deviations);
  358. var lastCustomNumber = 0;
  359. if (allDeviations.Any())
  360. lastCustomNumber = allDeviations
  361. .Max(d => StaticHelper.TryParseInt(d.CustomNumber));
  362. var deviationModel = new DeviationDataModel
  363. {
  364. Id = -1,
  365. SiteId = siteId,
  366. CustomNumber = (lastCustomNumber + 1).ToString(),
  367. Percentage = 1,
  368. };
  369. var defaultKind = _deviationService.GetDefaultKind();
  370. var defaultStatus = _deviationService.GetDefaultStatus();
  371. if (defaultKind != null)
  372. ViewData["DefaultKind"] = defaultKind.Id;
  373. if (defaultStatus != null)
  374. ViewData["DefaultStatus"] = defaultStatus.Id;
  375. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  376. }
  377. /// <summary>
  378. /// Partial edit for creating a new deviation for an appendix
  379. /// </summary>
  380. /// <param name="appendixId">Id of the appendix which the deviation should be appended to.</param>
  381. public ActionResult AppendDeviationToAppendix(int appendixId)
  382. {
  383. var appendix = _appendixService.GetAppendixById(appendixId);
  384. var site = appendix.Site;
  385. var allDeviations = new List<Deviation>();
  386. allDeviations.AddRange(
  387. site.Appendices
  388. .SelectMany(a => a.Deviations));
  389. allDeviations.AddRange(
  390. site.Deviations);
  391. var lastCustomNumber = allDeviations
  392. .Max(d => StaticHelper.TryParseInt(d.CustomNumber));
  393. var deviationModel = new DeviationDataModel
  394. {
  395. Id = -1,
  396. AppendixId = appendixId,
  397. CustomNumber = (lastCustomNumber + 1).ToString(),
  398. Percentage = 1,
  399. };
  400. var defaultKind = _deviationService.GetDefaultKind();
  401. var defaultStatus = _deviationService.GetDefaultStatus();
  402. if (defaultKind != null)
  403. ViewData["DefaultKind"] = defaultKind.Id;
  404. if (defaultStatus != null)
  405. ViewData["DefaultStatus"] = defaultStatus.Id;
  406. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  407. }
  408. /// <summary>
  409. /// Partial Edit result for assigning a deviation to a new appendix
  410. /// </summary>
  411. /// <param name="id">Id of deviation.</param>
  412. public ActionResult AssignDeviationToAppendix(int id)
  413. {
  414. var deviation = _deviationService.GetDeviationById(id);
  415. var availableAppendices = new List<Appendix>();
  416. if (deviation.Site != null)
  417. availableAppendices.AddRange(
  418. deviation.Site.Appendices);
  419. else if (deviation.Appendix != null && deviation.Appendix.Site != null)
  420. {
  421. availableAppendices.AddRange(
  422. deviation.Appendix.Site.Appendices
  423. .Where(a => a.Id != deviation.AppendixId));
  424. }
  425. var appendixModels = availableAppendices
  426. .Select(a => AppendixDataModel.FromAppendix(a, false))
  427. .ToList();
  428. if (deviation.Appendix != null && deviation.Appendix.Site != null)
  429. appendixModels.Insert(0, new AppendixDataModel { Id = -1, Description = "Keinem (Als \"Offen\" markieren)" });
  430. ViewData["DeviationId"] = id;
  431. return PartialView("~/Views/Deviations/_DeviationAssignPartial.cshtml", appendixModels);
  432. }
  433. /// <summary>
  434. /// Assigns a deviation to the specified appendix
  435. /// </summary>
  436. /// <param name="id">Id of deviation.</param>
  437. [HttpPost]
  438. public ActionResult AssignDeviation(int id, int appendixId)
  439. {
  440. try
  441. {
  442. var deviation = _deviationService.GetDeviationById(id);
  443. if (appendixId == -1 && deviation.Appendix != null && deviation.Appendix.Site != null)
  444. {
  445. deviation.SiteId = deviation.Appendix.SiteId;
  446. deviation.Appendix = null;
  447. deviation.AppendixId = null;
  448. }
  449. else
  450. {
  451. deviation.AppendixId = appendixId;
  452. deviation.Site = null;
  453. deviation.SiteId = null;
  454. }
  455. _deviationService.UpdateDeviation(deviation);
  456. return new JsonResult
  457. {
  458. Data = "success"
  459. };
  460. }
  461. catch (Exception ex)
  462. {
  463. _logger.Error("Fehler bei Zuweisung einer Vertragsabweichung zu einem Nachtrag.", ex, _userHelper.FromCookies());
  464. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  465. }
  466. }
  467. /// <summary>
  468. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  469. /// </summary>
  470. /// <param name="deviationModel">Deviation model to be saved.</param>
  471. [HttpPost, ValidateInput(false)]
  472. public ActionResult EditDeviation(DeviationDataModel deviationModel)
  473. {
  474. try
  475. {
  476. deviationModel.DisturbanceValueEntities =
  477. deviationModel.DisturbanceEntities
  478. .Select(r => JsonConvert.DeserializeObject<DisturbanceValueDataModel>(r))
  479. .ToList();
  480. for (int i = 0; i < deviationModel.DisturbanceValueEntities.Count; i++)
  481. deviationModel.DisturbanceValueEntities.ElementAt(i).Json = deviationModel.DisturbanceEntities.ElementAt(i);
  482. deviationModel.PercentageValue = deviationModel.Value * deviationModel.Percentage;
  483. if (!ModelState.IsValid)
  484. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  485. var disturbanceValues = deviationModel.DisturbanceValueEntities
  486. .Select(r => r.ToDisturbanceValue())
  487. .ToList();
  488. if (deviationModel.Id == -1)
  489. {
  490. var deviation = deviationModel.ToDeviation();
  491. deviation.SetDisturbanceValues(disturbanceValues);
  492. _deviationService.InsertDeviation(deviation);
  493. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  494. }
  495. else
  496. {
  497. var deviation = _deviationService.GetDeviationById(deviationModel.Id);
  498. deviation.CustomNumber = deviationModel.CustomNumber;
  499. deviation.Description = deviationModel.Description;
  500. deviation.ReceiptDate = deviationModel.ReceiptDate;
  501. deviation.AppendixDate = deviationModel.AppendixDate;
  502. deviation.Value = deviationModel.Value;
  503. deviation.AppendixId = deviationModel.AppendixId;
  504. deviation.StatusId = deviationModel.StatusId;
  505. deviation.KindId = deviationModel.KindId;
  506. deviation.Comment = deviationModel.Comment;
  507. deviation.SetDisturbanceValues(disturbanceValues);
  508. _deviationService.UpdateDeviation(deviation);
  509. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  510. }
  511. return new JsonResult
  512. {
  513. Data = "success"
  514. };
  515. }
  516. catch (Exception ex)
  517. {
  518. _logger.Error("Fehler bei Speicherung einer Vertragsabweichung.", ex, _userHelper.FromCookies());
  519. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  520. }
  521. }
  522. /// <summary>
  523. /// Simple JSON result for deleting a specific deviation
  524. /// </summary>
  525. /// <param name="id">Deviation id.</param>
  526. [HttpPost]
  527. public ActionResult DeleteDeviation(int id)
  528. {
  529. try
  530. {
  531. var deviation = _deviationService.GetDeviationById(id);
  532. if (deviation != null)
  533. _deviationService.DeleteDeviation(deviation);
  534. _logger.Entity(deviation, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  535. return new JsonResult
  536. {
  537. Data = "success"
  538. };
  539. }
  540. catch (Exception ex)
  541. {
  542. _logger.Error("Fehler bei Löschung einer Vertragsabweichung.", ex, _userHelper.FromCookies());
  543. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  544. }
  545. }
  546. #endregion
  547. #region Claims
  548. /// <summary>
  549. /// Basic claim view function
  550. /// </summary>
  551. [FunctionAuthorize(true, "Deviation-Claims")]
  552. public ActionResult ViewClaims()
  553. {
  554. return View("~/Views/Deviations/Claims.cshtml");
  555. }
  556. /// <summary>
  557. /// Get JSON data of specific claim
  558. /// </summary>
  559. /// <param name="claimType">Claim type.</param>
  560. /// <param name="id">Claim id.</param>
  561. public ActionResult GetClaim(string claimType, int id = -1)
  562. {
  563. switch (claimType.ToLower())
  564. {
  565. case "status":
  566. var status = _deviationService.GetStatusById(id);
  567. if (status == null)
  568. return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  569. else
  570. return new JsonResult {
  571. Data = JsonConvert.SerializeObject(status),
  572. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  573. };
  574. case "disturbance":
  575. var disturbance = _deviationService.GetDisturbanceById(id);
  576. if (disturbance == null)
  577. return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  578. else
  579. return new JsonResult
  580. {
  581. Data = JsonConvert.SerializeObject(disturbance),
  582. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  583. };
  584. case "kind":
  585. var kind = _deviationService.GetKindById(id);
  586. if (kind == null)
  587. return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  588. else
  589. return new JsonResult
  590. {
  591. Data = JsonConvert.SerializeObject(kind),
  592. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  593. };
  594. default:
  595. return new JsonResult { Data = "unknownClaimType", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  596. }
  597. }
  598. /// <summary>
  599. /// Callback result for claim grid
  600. /// </summary>
  601. /// <param name="claimType">Claim type.</param>
  602. public ActionResult PartialClaims(string claimType)
  603. {
  604. switch (claimType.ToLower())
  605. {
  606. case "status":
  607. return PartialView("~/Views/Deviations/_StatusListPartial.cshtml", ViewData["AllStatuses"]);
  608. case "disturbance":
  609. return PartialView("~/Views/Deviations/_DisturbanceListPartial.cshtml", ViewData["AllDisturbances"]);
  610. case "kind":
  611. return PartialView("~/Views/Deviations/_KindListPartial.cshtml", ViewData["AllKinds"]);
  612. default:
  613. return new EmptyResult();
  614. }
  615. }
  616. /// <summary>
  617. /// Partial edit for editing of existing or for new claim
  618. /// </summary>
  619. /// <param name="claimType">Claim type.</param>
  620. /// <param name="id">Id for existing claim, otherweise -1.</param>
  621. public ActionResult EditClaim(string claimType = "", int id = -1)
  622. {
  623. switch (claimType.ToLower())
  624. {
  625. case "status":
  626. var status = _deviationService.GetStatusById(id);
  627. var statusModel = StatusDataModel.FromStatus(status, true);
  628. return PartialView("~/Views/Deviations/_StatusEditPartial.cshtml", statusModel);
  629. case "disturbance":
  630. var disturbance = _deviationService.GetDisturbanceById(id);
  631. var disturbanceModel = DisturbanceDataModel.FromDisturbance(disturbance, true);
  632. return PartialView("~/Views/Deviations/_DisturbanceEditPartial.cshtml", disturbanceModel);
  633. case "kind":
  634. var kind = _deviationService.GetKindById(id);
  635. var kindModel = KindDataModel.FromKind(kind, true);
  636. return PartialView("~/Views/Deviations/_KindEditPartial.cshtml", kindModel);
  637. default:
  638. return new EmptyResult();
  639. }
  640. }
  641. /// <summary>
  642. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  643. /// </summary>
  644. /// <param name="statusModel">Status model to be saved.</param>
  645. [HttpPost, ValidateInput(false)]
  646. public ActionResult EditStatus(StatusDataModel statusModel)
  647. {
  648. try
  649. {
  650. if (!ModelState.IsValid)
  651. return PartialView("~/Views/Deviations/_StatusEditPartial.cshtml", statusModel);
  652. var allStatuses = _deviationService.GetAllStatuses();
  653. if (statusModel.IsDefault)
  654. {
  655. foreach (var status in allStatuses)
  656. {
  657. status.IsDefault = false;
  658. _deviationService.UpdateStatus(status);
  659. }
  660. }
  661. if (statusModel.Id == -1)
  662. {
  663. var claim = statusModel.ToStatus();
  664. _deviationService.InsertStatus(claim);
  665. _logger.Entity(claim, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  666. }
  667. else
  668. {
  669. var claim = _deviationService.GetStatusById(statusModel.Id);
  670. claim.Description = statusModel.Description;
  671. claim.IsDefault = statusModel.IsDefault;
  672. _deviationService.UpdateStatus(claim);
  673. _logger.Entity(claim, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  674. }
  675. return new JsonResult
  676. {
  677. Data = "success"
  678. };
  679. }
  680. catch (Exception ex)
  681. {
  682. _logger.Error("Fehler bei Speicherung eines VA-Status.", ex, _userHelper.FromCookies());
  683. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  684. }
  685. }
  686. /// <summary>
  687. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  688. /// </summary>
  689. /// <param name="disturbanceModel">Disturbance model to be saved.</param>
  690. [HttpPost, ValidateInput(false)]
  691. public ActionResult EditDisturbance(DisturbanceDataModel disturbanceModel)
  692. {
  693. try
  694. {
  695. if (!ModelState.IsValid)
  696. return PartialView("~/Views/Deviations/_DisturbanceEditPartial.cshtml", disturbanceModel);
  697. if (disturbanceModel.Id == -1)
  698. {
  699. var claim = disturbanceModel.ToDisturbance();
  700. _deviationService.InsertDisturbance(claim);
  701. _logger.Entity(claim, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  702. }
  703. else
  704. {
  705. var disturbance = _deviationService.GetDisturbanceById(disturbanceModel.Id);
  706. disturbance.Description = disturbanceModel.Description;
  707. _deviationService.UpdateDisturbance(disturbance);
  708. _logger.Entity(disturbance, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  709. }
  710. return new JsonResult
  711. {
  712. Data = "success"
  713. };
  714. }
  715. catch (Exception ex)
  716. {
  717. _logger.Error("Fehler bei Speicherung einer VA-Kategorie.", ex, _userHelper.FromCookies());
  718. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  719. }
  720. }
  721. /// <summary>
  722. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  723. /// </summary>
  724. /// <param name="kindModel">Kind model to be saved.</param>
  725. [HttpPost, ValidateInput(false)]
  726. public ActionResult EditKind(KindDataModel kindModel)
  727. {
  728. try
  729. {
  730. if (!ModelState.IsValid)
  731. return PartialView("~/Views/Deviations/_KindEditPartial.cshtml", kindModel);
  732. var allKinds = _deviationService.GetAllKinds();
  733. if (kindModel.IsDefault)
  734. {
  735. foreach (var kind in allKinds)
  736. {
  737. kind.IsDefault = false;
  738. _deviationService.UpdateKind(kind);
  739. }
  740. }
  741. if (kindModel.Id == -1)
  742. {
  743. var claim = kindModel.ToKind();
  744. _deviationService.InsertKind(claim);
  745. _logger.Entity(claim, Core.Domain.Logging.LogEntityActivity.Insert, _userHelper.FromCookies());
  746. }
  747. else
  748. {
  749. var kind = _deviationService.GetKindById(kindModel.Id);
  750. kind.Description = kindModel.Description;
  751. kind.IsDefault = kindModel.IsDefault;
  752. _deviationService.UpdateKind(kind);
  753. _logger.Entity(kind, Core.Domain.Logging.LogEntityActivity.Update, _userHelper.FromCookies());
  754. }
  755. return new JsonResult
  756. {
  757. Data = "success"
  758. };
  759. }
  760. catch (Exception ex)
  761. {
  762. _logger.Error("Fehler bei Speicherung einer Art.", ex, _userHelper.FromCookies());
  763. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  764. }
  765. }
  766. /// <summary>
  767. /// Simple JSON result for deleting a specific claim
  768. /// </summary>
  769. /// <param name="claimType">Claim type.</param>
  770. /// <param name="id">Claim id.</param>
  771. /// <param name="replaceId">Id of claim which deviations get in place of deleting claim.</param>
  772. [HttpPost]
  773. public ActionResult DeleteClaim(string claimType, int id, int replaceId)
  774. {
  775. switch (claimType.ToLower())
  776. {
  777. case "status":
  778. try
  779. {
  780. var status = _deviationService.GetStatusById(id);
  781. var replaceStatus = _deviationService.GetStatusById(replaceId);
  782. var statusDeviations = _deviationService.GetDeviationsByStatus(id);
  783. foreach (var deviation in statusDeviations)
  784. {
  785. deviation.StatusId = replaceId;
  786. deviation.Status = replaceStatus;
  787. _deviationService.UpdateDeviation(deviation);
  788. }
  789. if (status != null)
  790. _deviationService.DeleteStatus(status);
  791. _logger.Entity(status, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  792. }
  793. catch (Exception ex)
  794. {
  795. _logger.Error("Fehler bei Löschung eines VA-Status.", ex, _userHelper.FromCookies());
  796. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  797. }
  798. break;
  799. case "kind":
  800. try
  801. {
  802. var kind = _deviationService.GetKindById(id);
  803. var replaceKind = _deviationService.GetKindById(replaceId);
  804. var kindDeviations = _deviationService.GetDeviationsByKind(id);
  805. foreach (var deviation in kindDeviations)
  806. {
  807. deviation.KindId = replaceId;
  808. deviation.Kind = replaceKind;
  809. _deviationService.UpdateDeviation(deviation);
  810. }
  811. if (kind != null)
  812. _deviationService.DeleteKind(kind);
  813. _logger.Entity(kind, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  814. }
  815. catch (Exception ex)
  816. {
  817. _logger.Error("Fehler bei Löschung einer Art.", ex, _userHelper.FromCookies());
  818. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  819. }
  820. break;
  821. case "disturbance":
  822. try
  823. {
  824. var disturbance = _deviationService.GetDisturbanceById(id);
  825. var replaceDisturbance = _deviationService.GetDisturbanceById(replaceId);
  826. var allDeviations = _deviationService.GetAllDeviations();
  827. foreach (var deviation in allDeviations)
  828. {
  829. foreach (var disturbanceValue in deviation.DisturbanceValues)
  830. {
  831. if (disturbanceValue.DisturbanceId == id)
  832. {
  833. disturbanceValue.Disturbance = replaceDisturbance;
  834. disturbanceValue.DisturbanceId = replaceDisturbance.Id;
  835. }
  836. }
  837. _deviationService.UpdateDeviation(deviation);
  838. }
  839. if (disturbance != null)
  840. _deviationService.DeleteDisturbance(disturbance);
  841. _logger.Entity(disturbance, Core.Domain.Logging.LogEntityActivity.Delete, _userHelper.FromCookies());
  842. }
  843. catch (Exception ex)
  844. {
  845. _logger.Error("Fehler bei Löschung einer VA-Kategorie.", ex, _userHelper.FromCookies());
  846. return PartialView("~/Views/Shared/_PopupError.cshtml", ex);
  847. }
  848. break;
  849. default:
  850. return new EmptyResult();
  851. }
  852. return new JsonResult
  853. {
  854. Data = "success"
  855. };
  856. }
  857. #endregion
  858. #region Helper
  859. /// <summary>
  860. /// Uses a customFilter on a collection of deviation data models
  861. /// </summary>
  862. /// <param name="customFilters">Custom filter string.</param>
  863. /// <param name="models">Model list.</param>
  864. private void UseCustomFilters(string customFilters, List<DeviationDataModel> models)
  865. {
  866. var filters = JsonConvert.DeserializeObject(customFilters) as JObject;
  867. if (filters["DisturbanceValuesDescription"] != null && !String.IsNullOrEmpty(filters["DisturbanceValuesDescription"].Value<string>()))
  868. {
  869. var removables = new List<DeviationDataModel>();
  870. var filterVal = filters["DisturbanceValuesDescription"].Value<string>();
  871. foreach (var model in models)
  872. {
  873. var filterItemExists = model.DisturbanceValueEntities
  874. .Any(d => d.Description.ToLower().Contains(filterVal.ToLower()));
  875. if (!filterItemExists)
  876. removables.Add(model);
  877. else
  878. {
  879. var removeableValues = model.DisturbanceValueEntities
  880. .Where(d => !d.Description.ToLower().Contains(filterVal.ToLower()))
  881. .ToList();
  882. foreach (var removeableValue in removeableValues)
  883. model.DisturbanceValueEntities.Remove(removeableValue);
  884. if (removeableValues.Count > 0)
  885. model.DisturbanceValueEntities.Add(new DisturbanceValueDataModel { Description = "( ausgefilterte Kategorien )" });
  886. }
  887. }
  888. foreach (var removeable in removables)
  889. models.Remove(removeable);
  890. }
  891. }
  892. #endregion
  893. }
  894. }