CraftController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Http;
  5. using System.Threading.Tasks;
  6. using GreenTree.Strohrmann.ERP.Core.Domain.Business;
  7. using GreenTree.Strohrmann.ERP.Core.Extension;
  8. using GreenTree.Strohrmann.ERP.Core.Helper;
  9. using GreenTree.Strohrmann.ERP.Domain.Extension;
  10. using GreenTree.Strohrmann.ERP.Domain.Model;
  11. using GreenTree.Strohrmann.ERP.Services.Geolocator;
  12. using GreenTree.Strohrmann.ERP.Web.Extension;
  13. using GreenTree.Strohrmann.ERP.Web.Models.Business;
  14. using GreenTree.Strohrmann.ERP.Web.Models.Rights.User;
  15. using GreenTree.Strohrmann.ERP.Web.Validators;
  16. using Microsoft.AspNetCore.Http;
  17. using Microsoft.AspNetCore.Mvc;
  18. namespace GreenTree.Strohrmann.ERP.Web.Controllers
  19. {
  20. public class CraftController : Controller
  21. {
  22. #region DI fields
  23. // The global DbContext
  24. private readonly ERPDbContext _eRPDbContext;
  25. #endregion
  26. #region Ctor
  27. /// <summary>
  28. /// Initializes a new instance of the CraftController class
  29. /// </summary>
  30. /// <param name="eRPDbContext">Global DbContext.</param>
  31. public CraftController(ERPDbContext eRPDbContext)
  32. {
  33. _eRPDbContext = eRPDbContext;
  34. }
  35. #endregion
  36. #region Actions
  37. // GET: CraftController
  38. public ActionResult Index()
  39. {
  40. var crafts = _eRPDbContext.Crafts
  41. .ToList()
  42. .Select(c => new CraftModel(c));
  43. return View(crafts);
  44. }
  45. // GET: CraftController/Details/5
  46. public ActionResult Details(int id)
  47. {
  48. var craft = _eRPDbContext.Crafts
  49. .FirstOrDefault(c => c.Id == id);
  50. var craftModel = new CraftModel(craft);
  51. return View(craftModel);
  52. }
  53. // GET: CraftController/Create
  54. public ActionResult Create()
  55. {
  56. AddEmployeeListForSelection();
  57. return View();
  58. }
  59. // POST: CraftController/Create
  60. [HttpPost]
  61. [ValidateAntiForgeryToken]
  62. public ActionResult Create(CraftModel model)
  63. {
  64. if (!ModelState.IsValid)
  65. {
  66. AddEmployeeListForSelection();
  67. foreach (var item in model.CraftMaterials)
  68. {
  69. if (item.Value.Amount % 1 != 0)
  70. item.Value.Amount /= 10;
  71. item.Value.CalculationFactor = item.Value.CalculationFactor;
  72. }
  73. return View(model);
  74. }
  75. var craft = new Craft
  76. {
  77. Name = model.Name,
  78. CreationDate = model.CreationDate,
  79. Customer = _eRPDbContext.Customers.Find(model.CustomerId),
  80. Comment = model.Comment,
  81. CreatedBy = User.Identity.Name,
  82. CreatedOn = DateTime.Now
  83. };
  84. craft.CraftEmployees = new List<CraftEmployee>(
  85. model.CraftEmployees
  86. .Select(ce => new CraftEmployee
  87. {
  88. Craft = craft,
  89. Employee = _eRPDbContext.Employees.Find(ce.Value.EmployeeId),
  90. Amount = ce.Value.Amount,
  91. Value = ce.Value.Value,
  92. Comment = ce.Value.Comment
  93. }));
  94. craft.CraftMaterials = new List<CraftMaterial>(
  95. model.CraftMaterials
  96. .GroupBy(cm => cm.Value.MaterialId)
  97. .Select(cm => new CraftMaterial
  98. {
  99. Craft = craft,
  100. Material = _eRPDbContext.Materials.Find(cm.Key),
  101. Amount = cm.Sum(v => v.Value.Amount),
  102. CalculationFactor = cm.Average(v => v.Value.CalculationFactor),
  103. Value = cm.Sum(v => v.Value.Value)
  104. }));
  105. _eRPDbContext.Crafts.Add(craft);
  106. _eRPDbContext.SaveChanges();
  107. return RedirectToAction(nameof(Index));
  108. }
  109. // GET: CraftController/Edit/5
  110. public ActionResult Edit(int id)
  111. {
  112. AddEmployeeListForSelection();
  113. var craft = _eRPDbContext.Crafts
  114. .FirstOrDefault(c => c.Id == id);
  115. var craftModel = new CraftModel(craft);
  116. return View(craftModel);
  117. }
  118. // POST: CraftController/Edit/5
  119. [HttpPost]
  120. [ValidateAntiForgeryToken]
  121. public ActionResult Edit(int id, CraftModel model)
  122. {
  123. if (!ModelState.IsValid)
  124. {
  125. AddEmployeeListForSelection();
  126. foreach (var item in model.CraftMaterials)
  127. {
  128. if (item.Value.Amount % 1 != 0)
  129. item.Value.Amount /= 10;
  130. item.Value.CalculationFactor = item.Value.CalculationFactor;
  131. }
  132. return View(model);
  133. }
  134. var craft = _eRPDbContext.Crafts
  135. .FirstOrDefault(u => u.Id == id);
  136. craft.Name = model.Name;
  137. craft.CreationDate = model.CreationDate;
  138. craft.Customer = _eRPDbContext.Customers.Find(model.CustomerId);
  139. craft.Comment = model.Comment;
  140. craft.ChangedBy = User.Identity.Name;
  141. craft.ChangedOn = DateTime.Now;
  142. craft.CraftEmployees.Clear();
  143. craft.CraftMaterials.Clear();
  144. craft.CraftEmployees = new List<CraftEmployee>(
  145. model.CraftEmployees
  146. .Select(ce => new CraftEmployee
  147. {
  148. Craft = craft,
  149. Employee = _eRPDbContext.Employees.Find(ce.Value.EmployeeId),
  150. Amount = ce.Value.Amount,
  151. Value = ce.Value.Value,
  152. Comment = ce.Value.Comment
  153. }));
  154. craft.CraftMaterials = new List<CraftMaterial>(
  155. model.CraftMaterials
  156. .GroupBy(cm => cm.Value.MaterialId)
  157. .Select(cm => new CraftMaterial
  158. {
  159. Craft = craft,
  160. Material = _eRPDbContext.Materials.Find(cm.Key),
  161. Amount = cm.Sum(v => v.Value.Amount),
  162. CalculationFactor = cm.Average(v => v.Value.CalculationFactor),
  163. Value = cm.Sum(v => v.Value.Value)
  164. }));
  165. _eRPDbContext.SaveChanges();
  166. return RedirectToAction(nameof(Index));
  167. }
  168. // POST: CraftController/Delete/5
  169. [HttpPost]
  170. [ValidateAntiForgeryToken]
  171. public ActionResult Delete(int id, IFormCollection collection)
  172. {
  173. var craft = _eRPDbContext.Crafts
  174. .FirstOrDefault(c => c.Id == id);
  175. _eRPDbContext.Crafts.Remove(craft);
  176. _eRPDbContext.SaveChanges();
  177. return RedirectToAction(nameof(Index));
  178. }
  179. #endregion
  180. #region Partials
  181. // GET: CraftController/AddCraftEmployeePartial
  182. public ActionResult AddCraftEmployeePartial(CraftEmployeeModel craftEmployeeModel)
  183. {
  184. AddEmployeeListForSelection();
  185. ModelState.Clear();
  186. return PartialView("~/Views/Craft/_CraftEmployeePartial.cshtml", craftEmployeeModel);
  187. }
  188. // GET: CraftController/AddCraftMaterialPartial
  189. public ActionResult AddCraftMaterialPartial(CraftMaterialModel craftMaterialModel)
  190. {
  191. AddMaterialListForSelection();
  192. craftMaterialModel.CalculationFactor = 1.2f;
  193. return PartialView("~/Views/Craft/_CraftMaterialPartial.cshtml", craftMaterialModel);
  194. }
  195. #endregion
  196. #region Values
  197. // POST: CraftController/CalculateEmployeeValue
  198. [HttpPost]
  199. public ActionResult CalculateEmployeeValue(CraftEmployeeModel craftEmployeeModel)
  200. {
  201. if (craftEmployeeModel == null)
  202. return Ok(0);
  203. if (craftEmployeeModel.EmployeeId == default)
  204. return Ok(0);
  205. var employee = _eRPDbContext.Employees.Find(craftEmployeeModel.EmployeeId);
  206. var result = employee.EmployeeDegree.Value * craftEmployeeModel.Amount;
  207. return Ok(result);
  208. }
  209. // POST: CraftController/CalculateMaterialValue
  210. [HttpPost]
  211. public ActionResult CalculateMaterialValue(CraftMaterialModel craftMaterialModel)
  212. {
  213. if (craftMaterialModel == null)
  214. return Ok(0);
  215. if (craftMaterialModel.MaterialId == default)
  216. return Ok(0);
  217. var material = _eRPDbContext.Materials.Find(craftMaterialModel.MaterialId);
  218. var result = Math.Round(material.NetValue * craftMaterialModel.Amount * (craftMaterialModel.CalculationFactor / 100), 2);
  219. return Ok(result);
  220. }
  221. // POST: CraftController/CalculateMaterialCalculationFactor
  222. [HttpPost]
  223. public ActionResult CalculateMaterialCalculationFactor(CraftMaterialModel craftMaterialModel)
  224. {
  225. if (craftMaterialModel == null)
  226. return Ok(0);
  227. if (craftMaterialModel.MaterialId == default)
  228. return Ok(0);
  229. var material = _eRPDbContext.Materials.Find(craftMaterialModel.MaterialId);
  230. var result = craftMaterialModel.Value / (material.NetValue * craftMaterialModel.Amount);
  231. return Ok(result);
  232. }
  233. #endregion
  234. #region Helper
  235. /// <summary>
  236. /// Adds the employee SelectListItem collection to the current ViewData dictionary
  237. /// </summary>
  238. private void AddEmployeeListForSelection()
  239. {
  240. ViewData.AddSelectList("AvailableEmployees",
  241. _eRPDbContext.Employees
  242. .ToList()
  243. .Select(e => new EmployeeModel(e)),
  244. e => e.Id, e => String.Format("{0} {1} ({2} - {3:n0}€ / Std.)",
  245. e.Firstname, e.Lastname, e.EmployeeDegree.Name, e.EmployeeDegree.Value));
  246. }
  247. /// <summary>
  248. /// Adds the material SelectListItem collection to the current ViewData dictionary
  249. /// </summary>
  250. private void AddMaterialListForSelection()
  251. {
  252. ViewData.AddSelectList("AvailableMaterials",
  253. _eRPDbContext.Materials,
  254. m => m.Id, e => String.Format("{0} ({1})", e.Name, e.ItemNumber));
  255. }
  256. #endregion
  257. }
  258. }