Bladeren bron

Mitarbeiterfunktionen abgeschlossen!

Arne Diekmann 5 jaren geleden
bovenliggende
commit
362f2ecebb

+ 5 - 0
GreenTree.Strohrmann.ERP.Domain/Model/ERPDbContext.cs

@@ -40,6 +40,11 @@ namespace GreenTree.Strohrmann.ERP.Domain.Model
         /// </summary>
         public DbSet<Employee> Employees { get; set; }
 
+        /// <summary>
+        /// Employee degrees table
+        /// </summary>
+        public DbSet<EmployeeDegree> EmployeeDegrees { get; set; }
+
         /// <summary>
         /// Materials table
         /// </summary>

+ 1 - 14
GreenTree.Strohrmann.ERP.Web/Controllers/CustomerController.cs

@@ -21,12 +21,6 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
         // The global DbContext
         private readonly ERPDbContext _eRPDbContext;
 
-        // The global user helper
-        private readonly IUserHelper _userHelper;
-
-        // The global geocoding service
-        private readonly IGeocodingService _geocodingService;
-
         #endregion
 
         #region Ctor
@@ -35,16 +29,9 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
         /// Initializes a new instance of the CustomerController class
         /// </summary>
         /// <param name="eRPDbContext">Global DbContext.</param>
-        /// <param name="userHelper">Global user helper.</param>
-        /// <param name="geocodingService">Global geocoding service.</param>
-        public CustomerController(
-            ERPDbContext eRPDbContext,
-            IUserHelper userHelper,
-            IGeocodingService geocodingService)
+        public CustomerController(ERPDbContext eRPDbContext)
         {
             _eRPDbContext = eRPDbContext;
-            _userHelper = userHelper;
-            _geocodingService = geocodingService;
         }
 
         #endregion

+ 160 - 0
GreenTree.Strohrmann.ERP.Web/Controllers/EmployeeController.cs

@@ -0,0 +1,160 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using GreenTree.Strohrmann.ERP.Core.Domain.Business;
+using GreenTree.Strohrmann.ERP.Domain.Model;
+using GreenTree.Strohrmann.ERP.Web.Extension;
+using GreenTree.Strohrmann.ERP.Web.Models.Business;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Rendering;
+
+namespace GreenTree.Strohrmann.ERP.Web.Controllers
+{
+    public class EmployeeController : Controller
+    {
+        #region DI fields
+
+        // The global DbContext
+        private readonly ERPDbContext _eRPDbContext;
+
+        #endregion
+
+        #region Ctor
+
+        /// <summary>
+        /// Initializes a new instance of the EmployeeController class
+        /// </summary>
+        /// <param name="eRPDbContext">Global DbContext.</param>
+        public EmployeeController(ERPDbContext eRPDbContext)
+        {
+            _eRPDbContext = eRPDbContext;
+        }
+
+        #endregion
+
+        #region Actions
+
+        // GET: EmployeeController
+        public ActionResult Index()
+        {
+            var employees = _eRPDbContext.Employees
+                .ToList()
+                .Select(e => new EmployeeModel(e));
+
+            return View(employees);
+        }
+
+        // GET: EmployeeController/Details/5
+        public ActionResult Details(int id)
+        {
+            var employee = _eRPDbContext.Employees
+                .FirstOrDefault(e => e.Id == id);
+
+            var employeeModel = new EmployeeModel(employee);
+
+            return View(employeeModel);
+        }
+
+        // GET: EmployeeController/Create
+        public ActionResult Create()
+        {
+            ViewData.AddSelectList("AvailableDegrees", _eRPDbContext.EmployeeDegrees, m => m.Id, m => m.Name);
+
+            return View();
+        }
+
+        // POST: EmployeeController/Create
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public ActionResult Create(EmployeeModel model)
+        {
+            if (!ModelState.IsValid)
+            {
+                ViewData.AddSelectList("AvailableDegrees", _eRPDbContext.EmployeeDegrees, m => m.Id, m => m.Name);
+
+                return View(model);
+            }
+
+            var employee = new Employee
+            {
+                Firstname = model.Firstname,
+                Lastname = model.Lastname,
+                Birthdate = model.Birthdate,
+                MailAddress = model.MailAddress,
+                EmployeeDegree = _eRPDbContext.EmployeeDegrees.Find(model.EmployeeDegree.Id),
+                CreatedBy = User.Identity.Name,
+                CreatedOn = DateTime.Now
+            };
+
+            _eRPDbContext.Employees.Add(employee);
+            _eRPDbContext.SaveChanges();
+
+            return RedirectToAction(nameof(Index));
+        }
+
+        // GET: EmployeeController/Edit/5
+        public ActionResult Edit(int id)
+        {
+            ViewData.AddSelectList("AvailableDegrees", _eRPDbContext.EmployeeDegrees, m => m.Id, m => m.Name);
+
+            var employee = _eRPDbContext.Employees
+                .FirstOrDefault(c => c.Id == id);
+
+            var employeeModel = new EmployeeModel(employee);
+
+            return View(employeeModel);
+        }
+
+        // POST: EmployeeController/Edit/5
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public ActionResult Edit(int id, EmployeeModel model)
+        {
+            if (!ModelState.IsValid)
+            {
+                ViewData.AddSelectList("AvailableDegrees", _eRPDbContext.EmployeeDegrees, m => m.Id, m => m.Name);
+
+                return View(model);
+            }
+
+            var employee = _eRPDbContext.Employees
+                .FirstOrDefault(u => u.Id == id);
+
+            employee.Firstname = model.Firstname;
+            employee.Lastname = model.Lastname;
+            employee.Birthdate = model.Birthdate;
+            employee.MailAddress = model.MailAddress;
+            employee.EmployeeDegree = _eRPDbContext.EmployeeDegrees.Find(model.EmployeeDegree.Id);
+            employee.ChangedBy = User.Identity.Name;
+            employee.ChangedOn = DateTime.Now;
+
+            _eRPDbContext.SaveChanges();
+
+            return RedirectToAction(nameof(Index));
+        }
+
+        // POST: EmployeeController/Delete/5
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public ActionResult Delete(int id, IFormCollection collection)
+        {
+            var employee = _eRPDbContext.Employees
+                .FirstOrDefault(c => c.Id == id);
+
+            _eRPDbContext.Employees.Remove(employee);
+            _eRPDbContext.SaveChanges();
+
+            return RedirectToAction(nameof(Index));
+        }
+
+        #endregion
+
+        #region Helper
+
+
+
+        #endregion
+    }
+}

+ 50 - 0
GreenTree.Strohrmann.ERP.Web/Extension/ViewDataExtension.cs

@@ -0,0 +1,50 @@
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.AspNetCore.Mvc.ViewFeatures;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.Extension
+{
+    public static class ViewDataExtension
+    {
+        /// <summary>
+        /// Adds a predefined selection item list in the ViewData dictionary used by many HtmlContent input methods
+        /// </summary>
+        /// <typeparam name="TValue">The list base value type.</typeparam>
+        /// <param name="viewDataDict">The ViewData dictionary.</param>
+        /// <param name="key">The ViewData key.</param>
+        /// <param name="source">The base data source.</param>
+        /// <param name="valueExpression">The expression for the value.</param>
+        /// <param name="textExpression">The expression for the display text.</param>
+        /// <param name="selectedValue">The value of the optional pre selected item.</param>
+        public static void AddSelectList<TValue>(this ViewDataDictionary viewDataDict,
+            string key, IEnumerable<TValue> source, Func<TValue, object> valueExpression, Func<TValue, object> textExpression,
+            object selectedValue = null)
+        {
+            if (viewDataDict == null) return;
+
+            if (String.IsNullOrEmpty(key)) return;
+
+            if (source == null)
+                throw new ArgumentNullException("source", "The specified data source must not be NULL.");
+
+            var selectItemList = new List<SelectListItem>();
+
+            foreach (var item in source)
+            {
+                var val = valueExpression(item).ToString();
+                var text = textExpression(item).ToString();
+
+                if (selectedValue != null && val == selectedValue.ToString())
+                    selectItemList.Add(new SelectListItem(text, val, true));
+                else
+                    selectItemList.Add(new SelectListItem(text, val));
+            }
+
+            viewDataDict.Add(key, selectItemList);
+        }
+    }
+}

+ 17 - 0
GreenTree.Strohrmann.ERP.Web/Models/Business/EmployeeDegreeModel.cs

@@ -2,6 +2,7 @@
 using GreenTree.Strohrmann.ERP.Web.Models.Shared;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Threading.Tasks;
 
@@ -14,21 +15,25 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// <summary>
         /// Degree Id
         /// </summary>
+        [Display(Name = "ID")]
         public int Id { get; set; }
 
         /// <summary>
         /// Degree name
         /// </summary>
+        [Display(Name = "Name")]
         public string Name { get; set; }
 
         /// <summary>
         /// Degree value
         /// </summary>
+        [Display(Name = "Stundenwert (in Euro)")]
         public decimal Value { get; set; }
 
         /// <summary>
         /// Degree order
         /// </summary>
+        [Display(Name = "Stufe")]
         public int Order { get; set; }
 
         #endregion
@@ -55,5 +60,17 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         }
 
         #endregion
+
+        #region Overrides
+
+        /// <summary>
+        /// Returns a string that represents the current object with its' name
+        /// </summary>
+        public override string ToString()
+        {
+            return Name;
+        }
+
+        #endregion
     }
 }

+ 12 - 2
GreenTree.Strohrmann.ERP.Web/Models/Business/EmployeeModel.cs

@@ -3,6 +3,7 @@ using GreenTree.Strohrmann.ERP.Core.Domain.Shared;
 using GreenTree.Strohrmann.ERP.Web.Models.Shared;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Threading.Tasks;
 
@@ -15,31 +16,38 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// <summary>
         /// Employee Id
         /// </summary>
+        [Display(Name = "ID")]
         public int Id { get; set; }
 
         /// <summary>
         /// Employee first name
         /// </summary>
+        [Display(Name = "Vorname")]
         public string Firstname { get; set; }
 
         /// <summary>
         /// Employee last name
         /// </summary>
+        [Display(Name = "Nachname")]
         public string Lastname { get; set; }
 
         /// <summary>
         /// Employee mail address
         /// </summary>
+        [Display(Name = "Mail-Adresse")]
         public string MailAddress { get; set; }
 
         /// <summary>
         /// Employee birthdate
         /// </summary>
-        public DateTime? Birthdate { get; set; }
+        [Display(Name = "Geburtsdatum")]
+        [DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:dd.MM.yyyy}")]
+        public DateTime Birthdate { get; set; }
 
         /// <summary>
         /// Employee degree
         /// </summary>
+        [Display(Name = "Ausbildungsgrad")]
         public virtual EmployeeDegreeModel EmployeeDegree { get; set; }
 
         #endregion
@@ -64,7 +72,9 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
             Firstname = employee.Firstname;
             Lastname = employee.Lastname;
             MailAddress = employee.MailAddress;
-            Birthdate = employee.Birthdate;
+            Birthdate = employee.Birthdate.HasValue
+                ? employee.Birthdate.Value
+                : DateTime.MinValue;
             EmployeeDegree = new EmployeeDegreeModel(employee.EmployeeDegree);
         }
 

+ 12 - 0
GreenTree.Strohrmann.ERP.Web/Models/Business/TaxModel.cs

@@ -58,5 +58,17 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         }
 
         #endregion
+
+        #region Overrides
+
+        /// <summary>
+        /// Returns a string that represents the current object with its' short name
+        /// </summary>
+        public override string ToString()
+        {
+            return ShortName;
+        }
+
+        #endregion
     }
 }

+ 4 - 0
GreenTree.Strohrmann.ERP.Web/Validators/EmployeeValidator.cs

@@ -34,6 +34,10 @@ namespace GreenTree.Strohrmann.ERP.Web.Validators
 			RuleFor(m => m.Lastname)
 				.NotEmpty();
 
+			RuleFor(m => m.MailAddress)
+				.EmailAddress()
+				.WithMessage("Es muss eine gültige E-Mail Adresse eingegeben werden.");
+
 			RuleFor(m => m.EmployeeDegree)
 				.NotEmpty();
 		}

+ 3 - 3
GreenTree.Strohrmann.ERP.Web/Views/Customer/Create.cshtml

@@ -12,7 +12,7 @@
 <form asp-action="Create">
     <div asp-validation-summary="ModelOnly" class="text-danger"></div>
     <div class="card-deck">
-        <div class="card bg-light" style="max-width: 368px">
+        <div class="card card-maxw bg-light">
             <div class="card-header pb-1">
                 <h6>Kundenname / -firma</h6>
             </div>
@@ -34,7 +34,7 @@
                 </div>
             </div>
         </div>
-        <div class="card bg-light" style="max-width: 368px">
+        <div class="card card-maxw bg-light">
             <div class="card-header pb-1">
                 <h6>Adressdaten</h6>
             </div>
@@ -61,7 +61,7 @@
                 </div>
             </div>
         </div>
-        <div class="card bg-light" style="max-width: 368px">
+        <div class="card card-maxw bg-light">
             <div class="card-header pb-1">
                 <h6>Sonstige Daten</h6>
             </div>

+ 3 - 3
GreenTree.Strohrmann.ERP.Web/Views/Customer/Edit.cshtml

@@ -14,7 +14,7 @@
     <div asp-validation-summary="ModelOnly" class="text-danger"></div>
     <input asp-for="Id" type="hidden" class="form-control" />
     <div class="card-deck">
-        <div class="card bg-light" style="max-width: 368px">
+        <div class="card card-maxw bg-light">
             <div class="card-header pb-1">
                 <h6>Kundenname / -firma</h6>
             </div>
@@ -36,7 +36,7 @@
                 </div>
             </div>
         </div>
-        <div class="card bg-light" style="max-width: 368px">
+        <div class="card card-maxw bg-light">
             <div class="card-header pb-1">
                 <h6>Adressdaten</h6>
             </div>
@@ -63,7 +63,7 @@
                 </div>
             </div>
         </div>
-        <div class="card bg-light" style="max-width: 368px">
+        <div class="card card-maxw bg-light">
             <div class="card-header pb-1">
                 <h6>Sonstige Daten</h6>
             </div>

+ 1 - 1
GreenTree.Strohrmann.ERP.Web/Views/Customer/Index.cshtml

@@ -84,7 +84,7 @@
     <a asp-action="Create">Neuen Kunden erstellen</a>
 </p>
 
-<table id="customersTable" class="table responsive">
+<table id="customersTable" class="table table-striped responsive">
     <thead>
         <tr>
             <th data-priority="1">

+ 59 - 0
GreenTree.Strohrmann.ERP.Web/Views/Employee/Create.cshtml

@@ -0,0 +1,59 @@
+@model GreenTree.Strohrmann.ERP.Web.Models.Business.EmployeeModel
+
+@{
+    ViewData["Title"] = "Neuer Mitarbeiter";
+}
+
+<h1>Mitarbeiter erstellen</h1>
+
+<h4>Neuer Mitarbeiter</h4>
+<hr />
+
+<form asp-action="Create">
+    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
+    <div class="card-deck">
+        <div class="card card-maxw bg-light">
+            <div class="card-header pb-1">
+                <h6>Mitarbeiterdaten</h6>
+            </div>
+            <div class="card-body">
+                <div class="form-group">
+                    <label asp-for="Firstname" class="control-label"></label>
+                    <input asp-for="Firstname" class="form-control" />
+                    <span asp-validation-for="Firstname" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="Lastname" class="control-label"></label>
+                    <input asp-for="Lastname" class="form-control" />
+                    <span asp-validation-for="Lastname" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="Birthdate" class="control-label"></label>
+                    <input asp-for="Birthdate" type="date" class="form-control" />
+                    <span asp-validation-for="Birthdate" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="MailAddress" class="control-label"></label>
+                    <input asp-for="MailAddress" class="form-control" />
+                    <span asp-validation-for="MailAddress" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="EmployeeDegree" class="control-label">Rechte</label>
+                    @Html.DropDownListFor(e => e.EmployeeDegree.Id, 
+                        (IEnumerable<SelectListItem>)ViewData["AvailableDegrees"], 
+                        new { @class = "form-control" })
+                    <span asp-validation-for="EmployeeDegree" class="text-danger"></span>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <hr />
+
+    <div class="form-group d-flex mt-3">
+        <input type="submit" value="Erstellen" class="btn btn-primary" />
+        <div class="align-self-center ml-3">
+            <a asp-action="Index">Zurück zur Liste</a>
+        </div>
+    </div>
+</form>

+ 117 - 0
GreenTree.Strohrmann.ERP.Web/Views/Employee/Details.cshtml

@@ -0,0 +1,117 @@
+@model GreenTree.Strohrmann.ERP.Web.Models.Business.EmployeeModel
+
+@{
+    ViewData["Title"] = "Mitarbeiterdetails";
+}
+
+<h1>Mitarbeiterdetails</h1>
+
+<h4>@Model.Lastname, @Model.Firstname</h4>
+
+<hr />
+
+<div class="card-deck">
+    <div class="card card-md-maxw">
+        <div class="card-header pb-1">
+            <h6>Mitarbeiterdaten</h6>
+        </div>
+        <div class="card-body">
+            <dl class="row">
+                <dt class = "col-sm-6">
+                    @Html.DisplayNameFor(model => model.Id)
+                </dt>
+                <dd class = "col-sm-6">
+                    @Html.DisplayFor(model => model.Id)
+                </dd>
+                <dt class = "col-sm-6">
+                    @Html.DisplayNameFor(model => model.Firstname)
+                </dt>
+                <dd class = "col-sm-6">
+                    @Html.DisplayFor(model => model.Firstname)
+                </dd>
+                <dt class = "col-sm-6">
+                    @Html.DisplayNameFor(model => model.Lastname)
+                </dt>
+                <dd class = "col-sm-6">
+                    @Html.DisplayFor(model => model.Lastname)
+                </dd>
+                <dt class = "col-sm-6">
+                    @Html.DisplayNameFor(model => model.Birthdate)
+                </dt>
+                <dd class = "col-sm-6">
+                    @Html.DisplayFor(model => model.Birthdate)
+                </dd>
+                <dt class = "col-sm-6">
+                    @Html.DisplayNameFor(model => model.MailAddress)
+                </dt>
+                <dd class = "col-sm-6">
+                    @Html.DisplayFor(model => model.MailAddress)
+                </dd>
+                <dt class = "col-sm-6">
+                    @Html.DisplayNameFor(model => model.EmployeeDegree)
+                </dt>
+                <dd class = "col-sm-6">
+                    @Html.DisplayFor(model => model.EmployeeDegree.Name)
+                </dd>
+            </dl>
+        </div>
+    </div>
+</div>
+
+<hr />
+
+<div class="d-flex">
+    @Html.ActionLink("Bearbeiten", "Edit", new { id = Model.Id })
+    <div class="align-self-center ml-3">
+        <a asp-action="Index">Zurück zur Liste</a>
+    </div>
+    <div class="align-self-center ml-auto">
+        <a href="#" data-toggle="modal" data-target="#trackingModal">Änderungsinfo</a>
+    </div>
+</div>
+
+<div id="trackingModal" class="modal fade" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content modal-content-header-custom">
+            <div class="modal-header modal-header-info text-white">
+                <h5 class="modal-title">Änderungsinfo - @Model.Lastname, @Model.Firstname</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <dl class="row">
+                    <dt class = "col-sm-4">
+                        @Html.DisplayNameFor(model => model.CreatedBy)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.CreatedBy)
+                    </dd>
+                    <dt class = "col-sm-4">
+                        @Html.DisplayNameFor(model => model.CreatedOn)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.CreatedOn)
+                    </dd>
+                </dl>
+                <dl class="row">
+                    <dt class = "col-sm-4">
+                        @Html.DisplayNameFor(model => model.ChangedBy)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.ChangedBy)
+                    </dd>
+                    <dt class = "col-sm-4">
+                        @Html.DisplayNameFor(model => model.ChangedOn)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.ChangedOn)
+                    </dd>
+                </dl>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Schließen</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 61 - 0
GreenTree.Strohrmann.ERP.Web/Views/Employee/Edit.cshtml

@@ -0,0 +1,61 @@
+@model GreenTree.Strohrmann.ERP.Web.Models.Business.EmployeeModel
+
+@{
+    ViewData["Title"] = "Kunden bearbeiten";
+}
+
+<h1>Kunden bearbeiten</h1>
+
+<h4>@Model.Lastname, @Model.Firstname</h4>
+
+<hr />
+
+<form asp-action="Edit">
+    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
+    <input asp-for="Id" type="hidden" class="form-control" />
+    <div class="card-deck">
+        <div class="card card-maxw bg-light">
+            <div class="card-header pb-1">
+                <h6>Mitarbeiterdaten</h6>
+            </div>
+            <div class="card-body">
+                <div class="form-group">
+                    <label asp-for="Firstname" class="control-label"></label>
+                    <input asp-for="Firstname" class="form-control" />
+                    <span asp-validation-for="Firstname" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="Lastname" class="control-label"></label>
+                    <input asp-for="Lastname" class="form-control" />
+                    <span asp-validation-for="Lastname" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="Birthdate" class="control-label"></label>
+                    <input asp-for="Birthdate" type="date" class="form-control" />
+                    <span asp-validation-for="Birthdate" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="MailAddress" class="control-label"></label>
+                    <input asp-for="MailAddress" class="form-control" />
+                    <span asp-validation-for="MailAddress" class="text-danger"></span>
+                </div>
+                <div class="form-group">
+                    <label asp-for="EmployeeDegree" class="control-label">Rechte</label>
+                    @Html.DropDownListFor(e => e.EmployeeDegree.Id, 
+                        (IEnumerable<SelectListItem>)ViewData["AvailableDegrees"], 
+                        new { @class = "form-control" })
+                    <span asp-validation-for="EmployeeDegree" class="text-danger"></span>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <hr />
+
+    <div class="form-group d-flex mt-3">
+        <input type="submit" value="Speichern" class="btn btn-primary" />
+        <div class="align-self-center ml-3">
+            <a asp-action="Index">Zurück zur Liste</a>
+        </div>
+    </div>
+</form>

+ 153 - 0
GreenTree.Strohrmann.ERP.Web/Views/Employee/Index.cshtml

@@ -0,0 +1,153 @@
+@model IEnumerable<GreenTree.Strohrmann.ERP.Web.Models.Business.EmployeeModel>
+
+@{
+    ViewData["Title"] = "Mitarbeiterliste";
+}
+
+<!-- Custom JavaScript -->
+<script>
+
+    $(document).ready(function () {
+        $("#employeesTable").DataTable({
+            autoWidth: false,
+            paging: true,
+            pageLength: 50,
+            "bInfo": false,
+            columns: [
+                {
+                    data: "@Html.DisplayNameFor(model => model.Id)",
+                    orderable: true
+                },
+                {
+                    data: "@Html.DisplayNameFor(model => model.Firstname)",
+                    orderable: true
+                },
+                {
+                    data: "@Html.DisplayNameFor(model => model.Lastname)",
+                    orderable: true
+                },
+                {
+                    data: "@Html.DisplayNameFor(model => model.Birthdate)",
+                    orderable: true
+                },
+                {
+                    data: "@Html.DisplayNameFor(model => model.MailAddress)",
+                    orderable: true
+                },
+                {
+                    data: "@Html.DisplayNameFor(model => model.EmployeeDegree)",
+                    orderable: true
+                },
+                {
+                    data: "Aktionen",
+                    orderable: false
+				}
+            ],
+            language: {
+                zeroRecords: "Keine Einträge gefunden",
+                search: "Suchen:",
+                info: "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
+                lengthMenu: "Zeige _MENU_ Einträge",
+                paginate: {
+                    first: "Erste",
+                    last: "Letzte",
+                    next: "Nächste",
+                    previous: "Vorige"
+				}
+			}
+        });
+    });
+
+    function showDeleteModal(id) {
+        if (!id) return;
+        $('#deleteModal').modal("show");
+        $("[name='id'").val(id);
+    }
+
+</script>
+
+<h1>Mitarbeiterliste</h1>
+
+<p>
+    <a asp-action="Create">Neuen Mitarbeiter erstellen</a>
+</p>
+
+<table id="employeesTable" class="table table-striped responsive">
+    <thead>
+        <tr>
+            <th data-priority="1">
+                @Html.DisplayNameFor(model => model.Id)
+            </th>
+            <th data-priority="2">
+                @Html.DisplayNameFor(model => model.Firstname)
+            </th>
+            <th data-priority="3">
+                @Html.DisplayNameFor(model => model.Lastname)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Birthdate)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.MailAddress)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.EmployeeDegree)
+            </th>
+            <th data-priority="1">
+                Aktionen
+            </th>
+        </tr>
+    </thead>
+    <tbody>
+@foreach (var item in Model) {
+        <tr>
+            <td>
+                @Html.DisplayFor(modelItem => item.Id)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Firstname)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Lastname)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Birthdate)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.MailAddress)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.EmployeeDegree.Name)
+            </td>
+            <td>
+                @Html.ActionLink("Bearbeiten", "Edit", new { id = item.Id }) |
+                @Html.ActionLink("Anzeigen", "Details", new { id = item.Id }) |
+                <a href="#" onclick="showDeleteModal(@item.Id)">Löschen</a>
+            </td>
+        </tr>
+}
+    </tbody>
+</table>
+
+<div id="deleteModal" class="modal fade" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">Mitarbeiter löschen</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <form asp-action="Delete">
+                <div class="modal-body">
+                    <p>Sind Sie sicher, dass Sie diesen Mitarbeiter löschen möchten?</p>
+                    <input name="id" type="hidden" />
+                </div>
+                <div class="modal-footer">
+                    <button type="submit" class="btn btn-primary">Ja</button>
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Nein</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>

+ 20 - 0
GreenTree.Strohrmann.ERP.Web/wwwroot/css/site.css

@@ -150,4 +150,24 @@ body {
 .modal-content-header-custom {
     border-top-left-radius: .4rem;
     border-top-right-radius: .4rem;
+}
+
+.card-maxw {
+    max-width: 360px;
+}
+
+.card-sm-maxw {
+    max-width: 440px;
+}
+
+.card-md-maxw {
+    max-width: 560px;
+}
+
+.card-lg-maxw {
+    max-width: 700px;
+}
+
+.card-xl-maxw {
+    max-width: 760px;
 }