using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using GreenTree.Strohrmann.ERP.Core.Domain.Business; using GreenTree.Strohrmann.ERP.Core.Extension; using GreenTree.Strohrmann.ERP.Core.Helper; using GreenTree.Strohrmann.ERP.Domain.Extension; using GreenTree.Strohrmann.ERP.Domain.Model; using GreenTree.Strohrmann.ERP.Services.Geolocator; using GreenTree.Strohrmann.ERP.Web.Extension; using GreenTree.Strohrmann.ERP.Web.Models.Business; using GreenTree.Strohrmann.ERP.Web.Models.Rights.User; using GreenTree.Strohrmann.ERP.Web.Validators; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace GreenTree.Strohrmann.ERP.Web.Controllers { public class CraftController : Controller { #region DI fields // The global DbContext private readonly ERPDbContext _eRPDbContext; #endregion #region Ctor /// /// Initializes a new instance of the CraftController class /// /// Global DbContext. public CraftController(ERPDbContext eRPDbContext) { _eRPDbContext = eRPDbContext; } #endregion #region Actions // GET: CraftController public ActionResult Index() { var crafts = _eRPDbContext.Crafts .ToList() .Select(c => new CraftModel(c)); return View(crafts); } // GET: CraftController/Details/5 public ActionResult Details(int id) { var craft = _eRPDbContext.Crafts .FirstOrDefault(c => c.Id == id); var craftModel = new CraftModel(craft); return View(craftModel); } // GET: CraftController/Create public ActionResult Create() { AddEmployeeListForSelection(); return View(); } // POST: CraftController/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(CraftModel model) { if (!ModelState.IsValid) { AddEmployeeListForSelection(); foreach (var item in model.CraftMaterials) { if (item.Value.Amount % 1 != 0) item.Value.Amount /= 10; item.Value.CalculationFactor = item.Value.CalculationFactor; } return View(model); } var craft = new Craft { Name = model.Name, CreationDate = model.CreationDate, Customer = _eRPDbContext.Customers.Find(model.CustomerId), Comment = model.Comment, CreatedBy = User.Identity.Name, CreatedOn = DateTime.Now }; craft.CraftEmployees = new List( model.CraftEmployees .Select(ce => new CraftEmployee { Craft = craft, Employee = _eRPDbContext.Employees.Find(ce.Value.EmployeeId), Amount = ce.Value.Amount, Value = ce.Value.Value, Comment = ce.Value.Comment })); craft.CraftMaterials = new List( model.CraftMaterials .GroupBy(cm => cm.Value.MaterialId) .Select(cm => new CraftMaterial { Craft = craft, Material = _eRPDbContext.Materials.Find(cm.Key), Amount = cm.Sum(v => v.Value.Amount), CalculationFactor = cm.Average(v => v.Value.CalculationFactor), Value = cm.Sum(v => v.Value.Value) })); _eRPDbContext.Crafts.Add(craft); _eRPDbContext.SaveChanges(); return RedirectToAction(nameof(Index)); } // GET: CraftController/Edit/5 public ActionResult Edit(int id) { AddEmployeeListForSelection(); var craft = _eRPDbContext.Crafts .FirstOrDefault(c => c.Id == id); var craftModel = new CraftModel(craft); return View(craftModel); } // POST: CraftController/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(int id, CraftModel model) { if (!ModelState.IsValid) { AddEmployeeListForSelection(); foreach (var item in model.CraftMaterials) { if (item.Value.Amount % 1 != 0) item.Value.Amount /= 10; item.Value.CalculationFactor = item.Value.CalculationFactor; } return View(model); } var craft = _eRPDbContext.Crafts .FirstOrDefault(u => u.Id == id); craft.Name = model.Name; craft.CreationDate = model.CreationDate; craft.Customer = _eRPDbContext.Customers.Find(model.CustomerId); craft.Comment = model.Comment; craft.ChangedBy = User.Identity.Name; craft.ChangedOn = DateTime.Now; craft.CraftEmployees.Clear(); craft.CraftMaterials.Clear(); craft.CraftEmployees = new List( model.CraftEmployees .Select(ce => new CraftEmployee { Craft = craft, Employee = _eRPDbContext.Employees.Find(ce.Value.EmployeeId), Amount = ce.Value.Amount, Value = ce.Value.Value, Comment = ce.Value.Comment })); craft.CraftMaterials = new List( model.CraftMaterials .GroupBy(cm => cm.Value.MaterialId) .Select(cm => new CraftMaterial { Craft = craft, Material = _eRPDbContext.Materials.Find(cm.Key), Amount = cm.Sum(v => v.Value.Amount), CalculationFactor = cm.Average(v => v.Value.CalculationFactor), Value = cm.Sum(v => v.Value.Value) })); _eRPDbContext.SaveChanges(); return RedirectToAction(nameof(Index)); } // POST: CraftController/Delete/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int id, IFormCollection collection) { var craft = _eRPDbContext.Crafts .FirstOrDefault(c => c.Id == id); _eRPDbContext.Crafts.Remove(craft); _eRPDbContext.SaveChanges(); return RedirectToAction(nameof(Index)); } #endregion #region Partials // GET: CraftController/AddCraftEmployeePartial public ActionResult AddCraftEmployeePartial(CraftEmployeeModel craftEmployeeModel) { AddEmployeeListForSelection(); ModelState.Clear(); return PartialView("~/Views/Craft/_CraftEmployeePartial.cshtml", craftEmployeeModel); } // GET: CraftController/AddCraftMaterialPartial public ActionResult AddCraftMaterialPartial(CraftMaterialModel craftMaterialModel) { AddMaterialListForSelection(); craftMaterialModel.CalculationFactor = 1.2f; return PartialView("~/Views/Craft/_CraftMaterialPartial.cshtml", craftMaterialModel); } #endregion #region Values // POST: CraftController/CalculateEmployeeValue [HttpPost] public ActionResult CalculateEmployeeValue(CraftEmployeeModel craftEmployeeModel) { if (craftEmployeeModel == null) return Ok(0); if (craftEmployeeModel.EmployeeId == default) return Ok(0); var employee = _eRPDbContext.Employees.Find(craftEmployeeModel.EmployeeId); var result = employee.EmployeeDegree.Value * craftEmployeeModel.Amount; return Ok(result); } // POST: CraftController/CalculateMaterialValue [HttpPost] public ActionResult CalculateMaterialValue(CraftMaterialModel craftMaterialModel) { if (craftMaterialModel == null) return Ok(0); if (craftMaterialModel.MaterialId == default) return Ok(0); var material = _eRPDbContext.Materials.Find(craftMaterialModel.MaterialId); var result = Math.Round(material.NetValue * craftMaterialModel.Amount * (craftMaterialModel.CalculationFactor / 100), 2); return Ok(result); } // POST: CraftController/CalculateMaterialCalculationFactor [HttpPost] public ActionResult CalculateMaterialCalculationFactor(CraftMaterialModel craftMaterialModel) { if (craftMaterialModel == null) return Ok(0); if (craftMaterialModel.MaterialId == default) return Ok(0); var material = _eRPDbContext.Materials.Find(craftMaterialModel.MaterialId); var result = craftMaterialModel.Value / (material.NetValue * craftMaterialModel.Amount); return Ok(result); } #endregion #region Helper /// /// Adds the employee SelectListItem collection to the current ViewData dictionary /// private void AddEmployeeListForSelection() { ViewData.AddSelectList("AvailableEmployees", _eRPDbContext.Employees .ToList() .Select(e => new EmployeeModel(e)), e => e.Id, e => String.Format("{0} {1} ({2} - {3:n0}€ / Std.)", e.Firstname, e.Lastname, e.EmployeeDegree.Name, e.EmployeeDegree.Value)); } /// /// Adds the material SelectListItem collection to the current ViewData dictionary /// private void AddMaterialListForSelection() { ViewData.AddSelectList("AvailableMaterials", _eRPDbContext.Materials, m => m.Id, e => String.Format("{0} ({1})", e.Name, e.ItemNumber)); } #endregion } }