DeviationController.cs 18 KB

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