DeviationController.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. using DevExpress.Web.Mvc;
  2. using GreenTree.Nachtragsmanagement.Core;
  3. using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
  4. using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
  5. using GreenTree.Nachtragsmanagement.Services.Appendix;
  6. using GreenTree.Nachtragsmanagement.Services.Deviation;
  7. using GreenTree.Nachtragsmanagement.Services.Site;
  8. using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
  9. using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
  10. using GreenTree.Nachtragsmanagement.Web.Models.Global;
  11. using Newtonsoft.Json;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Web;
  16. using System.Web.Mvc;
  17. namespace GreenTree.Nachtragsmanagement.Web.Controllers
  18. {
  19. public class DeviationController : Controller
  20. {
  21. private readonly IDeviationService _deviationService;
  22. private readonly IAppendixService _appendixService;
  23. private readonly ISiteService _siteService;
  24. public DeviationController(
  25. IDeviationService deviationService,
  26. IAppendixService appendixService,
  27. ISiteService siteService)
  28. {
  29. _deviationService = deviationService;
  30. _appendixService = appendixService;
  31. _siteService = siteService;
  32. ViewData["AllDisturbances"] = _deviationService.GetAllDisturbances();
  33. ViewData["AllStatuses"] = _deviationService.GetAllStatuses();
  34. ViewData["AllKinds"] = _deviationService.GetAllKinds();
  35. }
  36. #region Deviations
  37. /// <summary>
  38. /// Basic deviation view function
  39. /// </summary>
  40. [FunctionAuthorize(true, "Deviation-Deviations")]
  41. public ActionResult ViewDeviations()
  42. {
  43. var deviations = _deviationService.GetAllDeviations();
  44. var deviationModels = deviations
  45. .Select(u => DeviationDataModel.FromDeviation(u, false))
  46. .ToList();
  47. return View("~/Views/Deviations/View.cshtml", deviationModels);
  48. }
  49. /// <summary>
  50. /// Get JSON data of specific deviation
  51. /// </summary>
  52. /// <param name="id">Deviation id.</param>
  53. public ActionResult GetDeviation(int id = -1)
  54. {
  55. var deviation = _deviationService.GetDeviationById(id);
  56. if (deviation == null)
  57. return new JsonResult
  58. {
  59. Data = "notFound",
  60. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  61. };
  62. var deviationModel = DeviationDataModel.FromDeviation(deviation, false);
  63. return new JsonResult
  64. {
  65. Data = JsonConvert.SerializeObject(deviationModel),
  66. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  67. };
  68. }
  69. /// <summary>
  70. /// Callback result for deviation grid
  71. /// </summary>
  72. /// <param name="scrollHeight">The height of the grid scrollable component.</param>
  73. public ActionResult PartialDeviations(int scrollHeight = -1)
  74. {
  75. var deviations = _deviationService.GetAllDeviations();
  76. var deviationModels = deviations
  77. .Select(u => DeviationDataModel.FromDeviation(u, false))
  78. .ToList();
  79. ViewData["ScrollHeight"] = scrollHeight;
  80. return PartialView("~/Views/Deviations/_DeviationGridPartial.cshtml", deviationModels);
  81. }
  82. /// <summary>
  83. /// Export result for deviation grid
  84. /// </summary>
  85. [HttpPost]
  86. public ActionResult ExportPartialDeviations(GridViewExportFormat exportformat)
  87. {
  88. if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
  89. return new EmptyResult();
  90. var deviations = _deviationService.GetAllDeviations();
  91. var deviationModels = deviations
  92. .Select(u => DeviationDataModel.FromDeviation(u, false))
  93. .ToList();
  94. var viewContext = new ViewContext();
  95. var viewPage = new ViewPage();
  96. var htmlHelper = new HtmlHelper(viewContext, viewPage);
  97. var gridViewSettings = Extensions.GridViewSettingsHelper.DeviationGridViewSettings(htmlHelper);
  98. switch (exportformat.Format.ToLower())
  99. {
  100. case "xlsx":
  101. return GridViewExtension.ExportToXlsx(gridViewSettings, deviationModels);
  102. case "xls":
  103. return GridViewExtension.ExportToXls(gridViewSettings, deviationModels);
  104. case "pdf":
  105. return GridViewExtension.ExportToPdf(gridViewSettings, deviationModels);
  106. default:
  107. return new EmptyResult();
  108. }
  109. }
  110. /// <summary>
  111. /// Partial edit for editing of existing or for new deviation
  112. /// </summary>
  113. /// <param name="id">Id for existing deviation, otherweise -1.</param>
  114. public ActionResult EditDeviation(int id = -1)
  115. {
  116. var deviation = _deviationService.GetDeviationById(id);
  117. var deviationModel = DeviationDataModel.FromDeviation(deviation, true);
  118. var defaultKind = _deviationService.GetDefaultKind();
  119. var defaultStatus = _deviationService.GetDefaultStatus();
  120. if (defaultKind != null)
  121. ViewData["DefaultKind"] = defaultKind.Id;
  122. if (defaultStatus != null)
  123. ViewData["DefaultStatus"] = defaultStatus.Id;
  124. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  125. }
  126. /// <summary>
  127. /// Partial edit for creating a new deviation for a site
  128. /// </summary>
  129. /// <param name="siteId">Id of the site which the deviation should be appended to.</param>
  130. public ActionResult AppendDeviationToSite(int siteId)
  131. {
  132. var site = _siteService.GetSiteById(siteId);
  133. var allDeviations = new List<Deviation>();
  134. allDeviations.AddRange(
  135. site.Appendices
  136. .SelectMany(a => a.Deviations));
  137. allDeviations.AddRange(
  138. site.Deviations);
  139. var lastCustomNumber = 0;
  140. if (allDeviations.Any())
  141. lastCustomNumber = allDeviations
  142. .Max(d => StaticHelper.TryParseInt(d.CustomNumber));
  143. var deviationModel = new DeviationDataModel
  144. {
  145. Id = -1,
  146. SiteId = siteId,
  147. CustomNumber = (lastCustomNumber + 1).ToString(),
  148. Percentage = 1,
  149. };
  150. var defaultKind = _deviationService.GetDefaultKind();
  151. var defaultStatus = _deviationService.GetDefaultStatus();
  152. if (defaultKind != null)
  153. ViewData["DefaultKind"] = defaultKind.Id;
  154. if (defaultStatus != null)
  155. ViewData["DefaultStatus"] = defaultStatus.Id;
  156. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  157. }
  158. /// <summary>
  159. /// Partial edit for creating a new deviation for an appendix
  160. /// </summary>
  161. /// <param name="appendixId">Id of the appendix which the deviation should be appended to.</param>
  162. public ActionResult AppendDeviationToAppendix(int appendixId)
  163. {
  164. var appendix = _appendixService.GetAppendixById(appendixId);
  165. var site = appendix.Site;
  166. var allDeviations = new List<Deviation>();
  167. allDeviations.AddRange(
  168. site.Appendices
  169. .SelectMany(a => a.Deviations));
  170. allDeviations.AddRange(
  171. site.Deviations);
  172. var lastCustomNumber = allDeviations
  173. .Max(d => StaticHelper.TryParseInt(d.CustomNumber));
  174. var deviationModel = new DeviationDataModel
  175. {
  176. Id = -1,
  177. AppendixId = appendixId,
  178. CustomNumber = (lastCustomNumber + 1).ToString(),
  179. Percentage = 1,
  180. };
  181. var defaultKind = _deviationService.GetDefaultKind();
  182. var defaultStatus = _deviationService.GetDefaultStatus();
  183. if (defaultKind != null)
  184. ViewData["DefaultKind"] = defaultKind.Id;
  185. if (defaultStatus != null)
  186. ViewData["DefaultStatus"] = defaultStatus.Id;
  187. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  188. }
  189. /// <summary>
  190. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  191. /// </summary>
  192. /// <param name="deviationModel">Deviation model to be saved.</param>
  193. [HttpPost, ValidateInput(false)]
  194. public ActionResult EditDeviation(DeviationDataModel deviationModel)
  195. {
  196. deviationModel.DisturbanceValueEntities =
  197. deviationModel.DisturbanceEntities
  198. .Select(r => JsonConvert.DeserializeObject<DisturbanceValueDataModel>(r))
  199. .ToList();
  200. for (int i = 0; i < deviationModel.DisturbanceValueEntities.Count; i++)
  201. deviationModel.DisturbanceValueEntities.ElementAt(i).Json = deviationModel.DisturbanceEntities.ElementAt(i);
  202. deviationModel.PercentageValue = deviationModel.Value * deviationModel.Percentage;
  203. if (!ModelState.IsValid)
  204. return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
  205. var disturbanceValues = deviationModel.DisturbanceValueEntities
  206. .Select(r => r.ToDisturbanceValue())
  207. .ToList();
  208. if (deviationModel.Id == -1)
  209. {
  210. var deviation = deviationModel.ToDeviation();
  211. deviation.SetDisturbanceValues(disturbanceValues);
  212. _deviationService.InsertDeviation(deviation);
  213. }
  214. else
  215. {
  216. var deviation = _deviationService.GetDeviationById(deviationModel.Id);
  217. deviation.CustomNumber = deviationModel.CustomNumber;
  218. deviation.Description = deviationModel.Description;
  219. deviation.ReceiptDate = deviationModel.ReceiptDate;
  220. deviation.AppendixDate = deviationModel.AppendixDate;
  221. deviation.Value = deviationModel.Value;
  222. deviation.AppendixId = deviationModel.AppendixId;
  223. deviation.StatusId = deviationModel.StatusId;
  224. deviation.KindId = deviationModel.KindId;
  225. deviation.Comment = deviationModel.Comment;
  226. deviation.SetDisturbanceValues(disturbanceValues);
  227. _deviationService.UpdateDeviation(deviation);
  228. }
  229. return new JsonResult
  230. {
  231. Data = "success"
  232. };
  233. }
  234. /// <summary>
  235. /// Simple JSON result for deleting a specific deviation
  236. /// </summary>
  237. /// <param name="id">Deviation id.</param>
  238. [HttpPost]
  239. public ActionResult DeleteDeviation(int id)
  240. {
  241. var deviation = _deviationService.GetDeviationById(id);
  242. if (deviation != null)
  243. _deviationService.DeleteDeviation(deviation);
  244. return new JsonResult
  245. {
  246. Data = "success"
  247. };
  248. }
  249. #endregion
  250. #region Claims
  251. /// <summary>
  252. /// Basic claim view function
  253. /// </summary>
  254. [FunctionAuthorize(true, "Deviation-Claims")]
  255. public ActionResult ViewClaims()
  256. {
  257. return View("~/Views/Deviations/Claims.cshtml");
  258. }
  259. /// <summary>
  260. /// Get JSON data of specific claim
  261. /// </summary>
  262. /// <param name="claimType">Claim type.</param>
  263. /// <param name="id">Claim id.</param>
  264. public ActionResult GetClaim(string claimType, int id = -1)
  265. {
  266. switch (claimType.ToLower())
  267. {
  268. case "status":
  269. var status = _deviationService.GetStatusById(id);
  270. if (status == null)
  271. return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  272. else
  273. return new JsonResult {
  274. Data = JsonConvert.SerializeObject(status),
  275. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  276. };
  277. case "disturbance":
  278. var disturbance = _deviationService.GetDisturbanceById(id);
  279. if (disturbance == null)
  280. return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  281. else
  282. return new JsonResult
  283. {
  284. Data = JsonConvert.SerializeObject(disturbance),
  285. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  286. };
  287. case "kind":
  288. var kind = _deviationService.GetKindById(id);
  289. if (kind == null)
  290. return new JsonResult { Data = "notFound", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  291. else
  292. return new JsonResult
  293. {
  294. Data = JsonConvert.SerializeObject(kind),
  295. JsonRequestBehavior = JsonRequestBehavior.AllowGet
  296. };
  297. default:
  298. return new JsonResult { Data = "unknownClaimType", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
  299. }
  300. }
  301. /// <summary>
  302. /// Callback result for claim grid
  303. /// </summary>
  304. /// <param name="claimType">Claim type.</param>
  305. public ActionResult PartialClaims(string claimType)
  306. {
  307. switch (claimType.ToLower())
  308. {
  309. case "status":
  310. return PartialView("~/Views/Deviations/_StatusListPartial.cshtml", ViewData["AllStatuses"]);
  311. case "disturbance":
  312. return PartialView("~/Views/Deviations/_DisturbanceListPartial.cshtml", ViewData["AllDisturbances"]);
  313. case "kind":
  314. return PartialView("~/Views/Deviations/_KindListPartial.cshtml", ViewData["AllKinds"]);
  315. default:
  316. return new EmptyResult();
  317. }
  318. }
  319. /// <summary>
  320. /// Partial edit for editing of existing or for new claim
  321. /// </summary>
  322. /// <param name="claimType">Claim type.</param>
  323. /// <param name="id">Id for existing claim, otherweise -1.</param>
  324. public ActionResult EditClaim(string claimType = "", int id = -1)
  325. {
  326. switch (claimType.ToLower())
  327. {
  328. case "status":
  329. var status = _deviationService.GetStatusById(id);
  330. var statusModel = StatusDataModel.FromStatus(status, true);
  331. return PartialView("~/Views/Deviations/_StatusEditPartial.cshtml", statusModel);
  332. case "disturbance":
  333. var disturbance = _deviationService.GetDisturbanceById(id);
  334. var disturbanceModel = DisturbanceDataModel.FromDisturbance(disturbance, true);
  335. return PartialView("~/Views/Deviations/_DisturbanceEditPartial.cshtml", disturbanceModel);
  336. case "kind":
  337. var kind = _deviationService.GetKindById(id);
  338. var kindModel = KindDataModel.FromKind(kind, true);
  339. return PartialView("~/Views/Deviations/_KindEditPartial.cshtml", kindModel);
  340. default:
  341. return new EmptyResult();
  342. }
  343. }
  344. /// <summary>
  345. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  346. /// </summary>
  347. /// <param name="statusModel">Status model to be saved.</param>
  348. [HttpPost, ValidateInput(false)]
  349. public ActionResult EditStatus(StatusDataModel statusModel)
  350. {
  351. if (!ModelState.IsValid)
  352. return PartialView("~/Views/Deviations/_StatusEditPartial.cshtml", statusModel);
  353. var allStatuses = _deviationService.GetAllStatuses();
  354. if (statusModel.IsDefault)
  355. {
  356. foreach (var status in allStatuses)
  357. {
  358. status.IsDefault = false;
  359. _deviationService.UpdateStatus(status);
  360. }
  361. }
  362. if (statusModel.Id == -1)
  363. {
  364. var claim = statusModel.ToStatus();
  365. _deviationService.InsertStatus(claim);
  366. }
  367. else
  368. {
  369. var claim = _deviationService.GetStatusById(statusModel.Id);
  370. claim.Description = statusModel.Description;
  371. claim.IsDefault = statusModel.IsDefault;
  372. _deviationService.UpdateStatus(claim);
  373. }
  374. return new JsonResult
  375. {
  376. Data = "success"
  377. };
  378. }
  379. /// <summary>
  380. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  381. /// </summary>
  382. /// <param name="disturbanceModel">Disturbance model to be saved.</param>
  383. [HttpPost, ValidateInput(false)]
  384. public ActionResult EditDisturbance(DisturbanceDataModel disturbanceModel)
  385. {
  386. if (!ModelState.IsValid)
  387. return PartialView("~/Views/Deviations/_DisturbanceEditPartial.cshtml", disturbanceModel);
  388. if (disturbanceModel.Id == -1)
  389. {
  390. var claim = disturbanceModel.ToDisturbance();
  391. _deviationService.InsertDisturbance(claim);
  392. }
  393. else
  394. {
  395. var disturbance = _deviationService.GetDisturbanceById(disturbanceModel.Id);
  396. disturbance.Description = disturbanceModel.Description;
  397. _deviationService.UpdateDisturbance(disturbance);
  398. }
  399. return new JsonResult
  400. {
  401. Data = "success"
  402. };
  403. }
  404. /// <summary>
  405. /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
  406. /// </summary>
  407. /// <param name="kindModel">Kind model to be saved.</param>
  408. [HttpPost, ValidateInput(false)]
  409. public ActionResult EditKind(KindDataModel kindModel)
  410. {
  411. if (!ModelState.IsValid)
  412. return PartialView("~/Views/Deviations/_KindEditPartial.cshtml", kindModel);
  413. var allKinds = _deviationService.GetAllKinds();
  414. if (kindModel.IsDefault)
  415. {
  416. foreach (var kind in allKinds)
  417. {
  418. kind.IsDefault = false;
  419. _deviationService.UpdateKind(kind);
  420. }
  421. }
  422. if (kindModel.Id == -1)
  423. {
  424. var claim = kindModel.ToKind();
  425. _deviationService.InsertKind(claim);
  426. }
  427. else
  428. {
  429. var kind = _deviationService.GetKindById(kindModel.Id);
  430. kind.Description = kindModel.Description;
  431. kind.IsDefault = kindModel.IsDefault;
  432. _deviationService.UpdateKind(kind);
  433. }
  434. return new JsonResult
  435. {
  436. Data = "success"
  437. };
  438. }
  439. /// <summary>
  440. /// Simple JSON result for deleting a specific claim
  441. /// </summary>
  442. /// <param name="claimType">Claim type.</param>
  443. /// <param name="id">Claim id.</param>
  444. /// <param name="replaceId">Id of claim which deviations get in place of deleting claim.</param>
  445. [HttpPost]
  446. public ActionResult DeleteClaim(string claimType, int id, int replaceId)
  447. {
  448. switch (claimType.ToLower())
  449. {
  450. case "status":
  451. var status = _deviationService.GetStatusById(id);
  452. var replaceStatus = _deviationService.GetStatusById(replaceId);
  453. var statusDeviations = _deviationService.GetDeviationsByStatus(id);
  454. foreach (var deviation in statusDeviations)
  455. {
  456. deviation.StatusId = replaceId;
  457. deviation.Status = replaceStatus;
  458. _deviationService.UpdateDeviation(deviation);
  459. }
  460. if (status != null)
  461. _deviationService.DeleteStatus(status);
  462. break;
  463. case "kind":
  464. var kind = _deviationService.GetKindById(id);
  465. var replaceKind = _deviationService.GetKindById(replaceId);
  466. var kindDeviations = _deviationService.GetDeviationsByKind(id);
  467. foreach (var deviation in kindDeviations)
  468. {
  469. deviation.KindId = replaceId;
  470. deviation.Kind = replaceKind;
  471. _deviationService.UpdateDeviation(deviation);
  472. }
  473. if (kind != null)
  474. _deviationService.DeleteKind(kind);
  475. break;
  476. case "disturbance":
  477. var disturbance = _deviationService.GetDisturbanceById(id);
  478. var replaceDisturbance = _deviationService.GetDisturbanceById(replaceId);
  479. var allDeviations = _deviationService.GetAllDeviations();
  480. foreach (var deviation in allDeviations)
  481. {
  482. foreach (var disturbanceValue in deviation.DisturbanceValues)
  483. {
  484. if (disturbanceValue.DisturbanceId == id)
  485. {
  486. disturbanceValue.Disturbance = replaceDisturbance;
  487. disturbanceValue.DisturbanceId = replaceDisturbance.Id;
  488. }
  489. }
  490. _deviationService.UpdateDeviation(deviation);
  491. }
  492. if (disturbance != null)
  493. _deviationService.DeleteDisturbance(disturbance);
  494. break;
  495. default:
  496. return new EmptyResult();
  497. }
  498. return new JsonResult
  499. {
  500. Data = "success"
  501. };
  502. }
  503. #endregion
  504. }
  505. }