Browse Source

Verbesserungen

Arne Diekmann 5 năm trước cách đây
mục cha
commit
bc63de51f1
36 tập tin đã thay đổi với 2322 bổ sung105 xóa
  1. 2 2
      GreenTree.Strohrmann.ERP.Core/Domain/Business/CraftEmployee.cs
  2. 3 3
      GreenTree.Strohrmann.ERP.Core/Domain/Business/CraftMaterial.cs
  3. 2 2
      GreenTree.Strohrmann.ERP.Core/Domain/Business/EmployeeDegree.cs
  4. 5 5
      GreenTree.Strohrmann.ERP.Core/Domain/Business/Material.cs
  5. 2 2
      GreenTree.Strohrmann.ERP.Core/Domain/Business/Tax.cs
  6. 739 0
      GreenTree.Strohrmann.ERP.Domain/Migrations/20201024232643_DoubleConversion.Designer.cs
  7. 129 0
      GreenTree.Strohrmann.ERP.Domain/Migrations/20201024232643_DoubleConversion.cs
  8. 739 0
      GreenTree.Strohrmann.ERP.Domain/Migrations/20201025000704_DoubleConversion_2.Designer.cs
  9. 139 0
      GreenTree.Strohrmann.ERP.Domain/Migrations/20201025000704_DoubleConversion_2.cs
  10. 30 30
      GreenTree.Strohrmann.ERP.Domain/Migrations/ERPDbContextModelSnapshot.cs
  11. 3 3
      GreenTree.Strohrmann.ERP.Domain/Model/Business/EmployeeDegreeMapping.cs
  12. 2 2
      GreenTree.Strohrmann.ERP.Domain/Model/Business/TaxMapping.cs
  13. 5 0
      GreenTree.Strohrmann.ERP.Services/Geolocator/GoogleApiOptions.cs
  14. 3 0
      GreenTree.Strohrmann.ERP.Services/Geolocator/GoogleGeocodingService.cs
  15. 1 13
      GreenTree.Strohrmann.ERP.Web/Configuration/DefaultOptionMonitoringService.cs
  16. 11 11
      GreenTree.Strohrmann.ERP.Web/Controllers/CraftController.cs
  17. 2 2
      GreenTree.Strohrmann.ERP.Web/Controllers/MaterialController.cs
  18. 3 3
      GreenTree.Strohrmann.ERP.Web/Extension/HtmlContentExtension.cs
  19. 21 2
      GreenTree.Strohrmann.ERP.Web/Models/Business/CraftEmployeeModel.cs
  20. 17 4
      GreenTree.Strohrmann.ERP.Web/Models/Business/CraftMaterialModel.cs
  21. 4 1
      GreenTree.Strohrmann.ERP.Web/Models/Business/CraftModel.cs
  22. 1 0
      GreenTree.Strohrmann.ERP.Web/Models/Business/CustomerModel.cs
  23. 1 1
      GreenTree.Strohrmann.ERP.Web/Models/Business/EmployeeDegreeModel.cs
  24. 12 0
      GreenTree.Strohrmann.ERP.Web/Models/Business/EmployeeModel.cs
  25. 5 5
      GreenTree.Strohrmann.ERP.Web/Models/Business/MaterialModel.cs
  26. 1 1
      GreenTree.Strohrmann.ERP.Web/Models/Business/TaxModel.cs
  27. 24 0
      GreenTree.Strohrmann.ERP.Web/Models/CustomerModelBinder.cs
  28. 28 0
      GreenTree.Strohrmann.ERP.Web/Models/CustomerModelBinderProvider.cs
  29. 5 1
      GreenTree.Strohrmann.ERP.Web/Startup.cs
  30. 337 0
      GreenTree.Strohrmann.ERP.Web/Views/Craft/Details.cshtml
  31. 1 1
      GreenTree.Strohrmann.ERP.Web/Views/Craft/Edit.cshtml
  32. 11 5
      GreenTree.Strohrmann.ERP.Web/Views/Craft/_CraftEmployeePartial.cshtml
  33. 3 3
      GreenTree.Strohrmann.ERP.Web/Views/Craft/_CraftMaterialPartial.cshtml
  34. 1 1
      GreenTree.Strohrmann.ERP.Web/Views/Material/Details.cshtml
  35. 3 2
      GreenTree.Strohrmann.ERP.Web/appsettings.json
  36. 27 0
      GreenTree.Strohrmann.ERP.Web/wwwroot/js/extension.js

+ 2 - 2
GreenTree.Strohrmann.ERP.Core/Domain/Business/CraftEmployee.cs

@@ -34,12 +34,12 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <summary>
         /// The amount of employee working hours
         /// </summary>
-        public decimal Amount { get; set; }
+        public float Amount { get; set; }
 
         /// <summary>
         /// The value of the employee working hours
         /// </summary>
-        public decimal Value { get; set; }
+        public float Value { get; set; }
 
         /// <summary>
         /// Employee comment

+ 3 - 3
GreenTree.Strohrmann.ERP.Core/Domain/Business/CraftMaterial.cs

@@ -29,16 +29,16 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <summary>
         /// The amount of the material
         /// </summary>
-        public decimal Amount { get; set; }
+        public float Amount { get; set; }
 
         /// <summary>
         /// The material calculation factor
         /// </summary>
-        public decimal CalculationFactor { get; set; }
+        public float CalculationFactor { get; set; }
 
         /// <summary>
         /// The craft material value
         /// </summary>
-        public decimal Value { get; set; }
+        public float Value { get; set; }
     }
 }

+ 2 - 2
GreenTree.Strohrmann.ERP.Core/Domain/Business/EmployeeDegree.cs

@@ -21,7 +21,7 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <summary>
         /// Degree value
         /// </summary>
-        public decimal Value { get; set; }
+        public float Value { get; set; }
 
         /// <summary>
         /// Degree order
@@ -49,7 +49,7 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <param name="name">The name.</param>
         /// <param name="value">The base value.</param>
         /// <param name="order">The ordering value.</param>
-        public EmployeeDegree(int id, string name, decimal value, int order)
+        public EmployeeDegree(int id, string name, float value, int order)
         {
             Id = id;
             Name = name;

+ 5 - 5
GreenTree.Strohrmann.ERP.Core/Domain/Business/Material.cs

@@ -30,22 +30,22 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <summary>
         /// Material net value
         /// </summary>
-        public decimal NetValue { get; set; }
+        public float NetValue { get; set; }
 
         /// <summary>
         /// Material height
         /// </summary>
-        public decimal Height { get; set; }
+        public float Height { get; set; }
 
         /// <summary>
         /// Material width
         /// </summary>
-        public decimal Width { get; set; }
+        public float Width { get; set; }
 
         /// <summary>
         /// Material depth
         /// </summary>
-        public decimal Depth { get; set; }
+        public float Depth { get; set; }
 
         /// <summary>
         /// Material default unit
@@ -55,7 +55,7 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <summary>
         /// The amount of items per package
         /// </summary>
-        public decimal PackageSize { get; set; }
+        public float PackageSize { get; set; }
 
         /// <summary>
         /// Material supplier

+ 2 - 2
GreenTree.Strohrmann.ERP.Core/Domain/Business/Tax.cs

@@ -26,7 +26,7 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <summary>
         /// Tax percentage value
         /// </summary>
-        public decimal Value { get; set; }
+        public float Value { get; set; }
 
         /// <summary>
         /// Tax customers
@@ -49,7 +49,7 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Business
         /// <param name="Name">The name.</param>
         /// <param name="shortName">The short name.</param>
         /// <param name="value">The percentage value.</param>
-        public Tax(int id, string name, string shortName, decimal value) 
+        public Tax(int id, string name, string shortName, float value) 
         {
             Id = id;
             Name = name;

+ 739 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/20201024232643_DoubleConversion.Designer.cs

@@ -0,0 +1,739 @@
+// <auto-generated />
+using System;
+using GreenTree.Strohrmann.ERP.Domain.Model;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace GreenTree.Strohrmann.ERP.Domain.Migrations
+{
+    [DbContext(typeof(ERPDbContext))]
+    [Migration("20201024232643_DoubleConversion")]
+    partial class DoubleConversion
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "3.1.5")
+                .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<DateTime>("CreationDate")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<int>("CustomerId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomerId");
+
+                    b.ToTable("Crafts");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftEmployee", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("Amount")
+                        .HasColumnType("decimal(65,30)");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<int>("CraftId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("EmployeeId")
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("Value")
+                        .HasColumnType("decimal(65,30)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CraftId");
+
+                    b.HasIndex("EmployeeId");
+
+                    b.ToTable("CraftEmployees");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftMaterial", b =>
+                {
+                    b.Property<int>("CraftId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("MaterialId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Amount")
+                        .HasColumnType("float");
+
+                    b.Property<float>("CalculationFactor")
+                        .HasColumnType("float");
+
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
+
+                    b.HasKey("CraftId", "MaterialId");
+
+                    b.HasIndex("MaterialId");
+
+                    b.ToTable("CraftMaterials");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Customer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("CompanyName")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Country")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Firstname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<bool>("IsBusiness")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint(1)")
+                        .HasDefaultValue(false);
+
+                    b.Property<string>("Lastname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<int?>("TaxId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("TitleId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Town")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaxId");
+
+                    b.HasIndex("TitleId");
+
+                    b.ToTable("Customers");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Employee", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("Birthdate")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<int>("EmployeeDegreeId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Firstname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Lastname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailAddress")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EmployeeDegreeId");
+
+                    b.ToTable("Employees");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.EmployeeDegree", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("Value")
+                        .HasColumnType("decimal(65,30)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("EmployeeDegrees");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Meister",
+                            Order = 3,
+                            Value = 60m
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Geselle",
+                            Order = 2,
+                            Value = 30m
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Name = "Aushilfe",
+                            Order = 1,
+                            Value = 15m
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Material", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<int>("DefaultUnitId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Depth")
+                        .HasColumnType("float");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<float>("Height")
+                        .HasColumnType("float");
+
+                    b.Property<string>("ItemNumber")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<float>("NetValue")
+                        .HasColumnType("float");
+
+                    b.Property<float>("PackageSize")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("float")
+                        .HasDefaultValue(1f);
+
+                    b.Property<int>("SupplierId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Width")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DefaultUnitId");
+
+                    b.HasIndex("SupplierId");
+
+                    b.ToTable("Materials");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Supplier", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Country")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailFirst")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailSecond")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("PhoneFirst")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("PhoneSecond")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Town")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Suppliers");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Tax", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ShortName")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<decimal>("Value")
+                        .HasColumnType("decimal(65,30)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Taxes");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Deutschland Umsatzsteuer",
+                            ShortName = "Umst. (19%)",
+                            Value = 0.19m
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Deutschland Umsatzsteuer 2020",
+                            ShortName = "Umst. (16%) 2020",
+                            Value = 0.16m
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Title", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Titles");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Keiner"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Herr"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Name = "Frau"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Name = "Firma"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Name = "Familie"
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Name = "Eheleute"
+                        },
+                        new
+                        {
+                            Id = 7,
+                            Name = "Herr und Frau"
+                        },
+                        new
+                        {
+                            Id = 8,
+                            Name = "Prof."
+                        },
+                        new
+                        {
+                            Id = 9,
+                            Name = "Dr."
+                        },
+                        new
+                        {
+                            Id = 10,
+                            Name = "Dr. med."
+                        },
+                        new
+                        {
+                            Id = 11,
+                            Name = "Prof. Dr."
+                        },
+                        new
+                        {
+                            Id = 12,
+                            Name = "Prof. Dr. med."
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Unit", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ShortName")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Units");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 8,
+                            Description = "Angabe in Einheit Milimeter",
+                            Name = "Milimeter",
+                            ShortName = "mm"
+                        },
+                        new
+                        {
+                            Id = 1,
+                            Description = "Angabe in Einheit Meter",
+                            Name = "Meter",
+                            ShortName = "m"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Description = "Angabe in Einheit Quadratmeter",
+                            Name = "Quadratmeter",
+                            ShortName = "m²"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Description = "Angabe in Einheit Kubikmeter",
+                            Name = "Kubikmeter",
+                            ShortName = "m³"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Description = "Angabe in Einheit Liter",
+                            Name = "Liter",
+                            ShortName = "l"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Description = "Angabe in Stückzahl",
+                            Name = "Stück",
+                            ShortName = "Stck."
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Description = "Angabe in Stückzahl",
+                            Name = "Kilogramm",
+                            ShortName = "Kg"
+                        },
+                        new
+                        {
+                            Id = 7,
+                            Description = "Angabe in Zeitstunden",
+                            Name = "Stunden",
+                            ShortName = "Std."
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.Policy", b =>
+                {
+                    b.Property<string>("Name")
+                        .HasColumnType("varchar(255) CHARACTER SET utf8mb4");
+
+                    b.HasKey("Name");
+
+                    b.ToTable("Policies");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Accountname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<bool?>("Activated")
+                        .IsRequired()
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint(1)")
+                        .HasDefaultValue(true);
+
+                    b.Property<DateTime?>("Birthdate")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Forename")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Lastname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailAddress")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.UserPolicy", b =>
+                {
+                    b.Property<int>("UserId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("PolicyName")
+                        .HasColumnType("varchar(255) CHARACTER SET utf8mb4");
+
+                    b.HasKey("UserId", "PolicyName");
+
+                    b.ToTable("UserPolicies");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Customer", "Customer")
+                        .WithMany("Crafts")
+                        .HasForeignKey("CustomerId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftEmployee", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", "Craft")
+                        .WithMany("CraftEmployees")
+                        .HasForeignKey("CraftId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Employee", "Employee")
+                        .WithMany()
+                        .HasForeignKey("EmployeeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftMaterial", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", "Craft")
+                        .WithMany("CraftMaterials")
+                        .HasForeignKey("CraftId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Material", "Material")
+                        .WithMany()
+                        .HasForeignKey("MaterialId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Customer", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Tax", "Tax")
+                        .WithMany("Customers")
+                        .HasForeignKey("TaxId")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Title", "Title")
+                        .WithMany("Customers")
+                        .HasForeignKey("TitleId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Employee", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.EmployeeDegree", "EmployeeDegree")
+                        .WithMany("Employees")
+                        .HasForeignKey("EmployeeDegreeId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Material", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Unit", "DefaultUnit")
+                        .WithMany("Materials")
+                        .HasForeignKey("DefaultUnitId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Supplier", "Supplier")
+                        .WithMany("Materials")
+                        .HasForeignKey("SupplierId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.UserPolicy", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Rights.User", "User")
+                        .WithMany("Policies")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 129 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/20201024232643_DoubleConversion.cs

@@ -0,0 +1,129 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace GreenTree.Strohrmann.ERP.Domain.Migrations
+{
+    public partial class DoubleConversion : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<float>(
+                name: "Width",
+                table: "Materials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "PackageSize",
+                table: "Materials",
+                nullable: false,
+                defaultValue: 1f,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)",
+                oldDefaultValue: 1m);
+
+            migrationBuilder.AlterColumn<float>(
+                name: "NetValue",
+                table: "Materials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Height",
+                table: "Materials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Depth",
+                table: "Materials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Value",
+                table: "CraftMaterials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "CalculationFactor",
+                table: "CraftMaterials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Amount",
+                table: "CraftMaterials",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Width",
+                table: "Materials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "PackageSize",
+                table: "Materials",
+                type: "decimal(65,30)",
+                nullable: false,
+                defaultValue: 1m,
+                oldClrType: typeof(float),
+                oldDefaultValue: 1f);
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "NetValue",
+                table: "Materials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Height",
+                table: "Materials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Depth",
+                table: "Materials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Value",
+                table: "CraftMaterials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "CalculationFactor",
+                table: "CraftMaterials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Amount",
+                table: "CraftMaterials",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+        }
+    }
+}

+ 739 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/20201025000704_DoubleConversion_2.Designer.cs

@@ -0,0 +1,739 @@
+// <auto-generated />
+using System;
+using GreenTree.Strohrmann.ERP.Domain.Model;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace GreenTree.Strohrmann.ERP.Domain.Migrations
+{
+    [DbContext(typeof(ERPDbContext))]
+    [Migration("20201025000704_DoubleConversion_2")]
+    partial class DoubleConversion_2
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "3.1.5")
+                .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<DateTime>("CreationDate")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<int>("CustomerId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CustomerId");
+
+                    b.ToTable("Crafts");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftEmployee", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<float>("Amount")
+                        .HasColumnType("float");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<int>("CraftId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("EmployeeId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CraftId");
+
+                    b.HasIndex("EmployeeId");
+
+                    b.ToTable("CraftEmployees");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftMaterial", b =>
+                {
+                    b.Property<int>("CraftId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("MaterialId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Amount")
+                        .HasColumnType("float");
+
+                    b.Property<float>("CalculationFactor")
+                        .HasColumnType("float");
+
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
+
+                    b.HasKey("CraftId", "MaterialId");
+
+                    b.HasIndex("MaterialId");
+
+                    b.ToTable("CraftMaterials");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Customer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("CompanyName")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Country")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Firstname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<bool>("IsBusiness")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint(1)")
+                        .HasDefaultValue(false);
+
+                    b.Property<string>("Lastname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<int?>("TaxId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("TitleId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Town")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaxId");
+
+                    b.HasIndex("TitleId");
+
+                    b.ToTable("Customers");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Employee", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("Birthdate")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<int>("EmployeeDegreeId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Firstname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Lastname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailAddress")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EmployeeDegreeId");
+
+                    b.ToTable("Employees");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.EmployeeDegree", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("EmployeeDegrees");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Meister",
+                            Order = 3,
+                            Value = 60f
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Geselle",
+                            Order = 2,
+                            Value = 30f
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Name = "Aushilfe",
+                            Order = 1,
+                            Value = 15f
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Material", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<int>("DefaultUnitId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Depth")
+                        .HasColumnType("float");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<float>("Height")
+                        .HasColumnType("float");
+
+                    b.Property<string>("ItemNumber")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<float>("NetValue")
+                        .HasColumnType("float");
+
+                    b.Property<float>("PackageSize")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("float")
+                        .HasDefaultValue(1f);
+
+                    b.Property<int>("SupplierId")
+                        .HasColumnType("int");
+
+                    b.Property<float>("Width")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DefaultUnitId");
+
+                    b.HasIndex("SupplierId");
+
+                    b.ToTable("Materials");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Supplier", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ChangedBy")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime?>("ChangedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Comment")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Country")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<DateTime>("CreatedOn")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailFirst")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailSecond")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("PhoneFirst")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("PhoneSecond")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Town")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Suppliers");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Tax", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ShortName")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Taxes");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Deutschland Umsatzsteuer",
+                            ShortName = "Umst. (19%)",
+                            Value = 0.19f
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Deutschland Umsatzsteuer 2020",
+                            ShortName = "Umst. (16%) 2020",
+                            Value = 0.16f
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Title", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Titles");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 1,
+                            Name = "Keiner"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Name = "Herr"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Name = "Frau"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Name = "Firma"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Name = "Familie"
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Name = "Eheleute"
+                        },
+                        new
+                        {
+                            Id = 7,
+                            Name = "Herr und Frau"
+                        },
+                        new
+                        {
+                            Id = 8,
+                            Name = "Prof."
+                        },
+                        new
+                        {
+                            Id = 9,
+                            Name = "Dr."
+                        },
+                        new
+                        {
+                            Id = 10,
+                            Name = "Dr. med."
+                        },
+                        new
+                        {
+                            Id = 11,
+                            Name = "Prof. Dr."
+                        },
+                        new
+                        {
+                            Id = 12,
+                            Name = "Prof. Dr. med."
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Unit", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("ShortName")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Units");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = 8,
+                            Description = "Angabe in Einheit Milimeter",
+                            Name = "Milimeter",
+                            ShortName = "mm"
+                        },
+                        new
+                        {
+                            Id = 1,
+                            Description = "Angabe in Einheit Meter",
+                            Name = "Meter",
+                            ShortName = "m"
+                        },
+                        new
+                        {
+                            Id = 2,
+                            Description = "Angabe in Einheit Quadratmeter",
+                            Name = "Quadratmeter",
+                            ShortName = "m²"
+                        },
+                        new
+                        {
+                            Id = 3,
+                            Description = "Angabe in Einheit Kubikmeter",
+                            Name = "Kubikmeter",
+                            ShortName = "m³"
+                        },
+                        new
+                        {
+                            Id = 4,
+                            Description = "Angabe in Einheit Liter",
+                            Name = "Liter",
+                            ShortName = "l"
+                        },
+                        new
+                        {
+                            Id = 5,
+                            Description = "Angabe in Stückzahl",
+                            Name = "Stück",
+                            ShortName = "Stck."
+                        },
+                        new
+                        {
+                            Id = 6,
+                            Description = "Angabe in Stückzahl",
+                            Name = "Kilogramm",
+                            ShortName = "Kg"
+                        },
+                        new
+                        {
+                            Id = 7,
+                            Description = "Angabe in Zeitstunden",
+                            Name = "Stunden",
+                            ShortName = "Std."
+                        });
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.Policy", b =>
+                {
+                    b.Property<string>("Name")
+                        .HasColumnType("varchar(255) CHARACTER SET utf8mb4");
+
+                    b.HasKey("Name");
+
+                    b.ToTable("Policies");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    b.Property<string>("Accountname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<bool?>("Activated")
+                        .IsRequired()
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint(1)")
+                        .HasDefaultValue(true);
+
+                    b.Property<DateTime?>("Birthdate")
+                        .HasColumnType("datetime(6)");
+
+                    b.Property<string>("Forename")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Lastname")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("MailAddress")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.UserPolicy", b =>
+                {
+                    b.Property<int>("UserId")
+                        .HasColumnType("int");
+
+                    b.Property<string>("PolicyName")
+                        .HasColumnType("varchar(255) CHARACTER SET utf8mb4");
+
+                    b.HasKey("UserId", "PolicyName");
+
+                    b.ToTable("UserPolicies");
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Customer", "Customer")
+                        .WithMany("Crafts")
+                        .HasForeignKey("CustomerId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftEmployee", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", "Craft")
+                        .WithMany("CraftEmployees")
+                        .HasForeignKey("CraftId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Employee", "Employee")
+                        .WithMany()
+                        .HasForeignKey("EmployeeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.CraftMaterial", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Craft", "Craft")
+                        .WithMany("CraftMaterials")
+                        .HasForeignKey("CraftId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Material", "Material")
+                        .WithMany()
+                        .HasForeignKey("MaterialId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Customer", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Tax", "Tax")
+                        .WithMany("Customers")
+                        .HasForeignKey("TaxId")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Title", "Title")
+                        .WithMany("Customers")
+                        .HasForeignKey("TitleId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Employee", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.EmployeeDegree", "EmployeeDegree")
+                        .WithMany("Employees")
+                        .HasForeignKey("EmployeeDegreeId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Business.Material", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Unit", "DefaultUnit")
+                        .WithMany("Materials")
+                        .HasForeignKey("DefaultUnitId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Business.Supplier", "Supplier")
+                        .WithMany("Materials")
+                        .HasForeignKey("SupplierId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("GreenTree.Strohrmann.ERP.Core.Domain.Rights.UserPolicy", b =>
+                {
+                    b.HasOne("GreenTree.Strohrmann.ERP.Core.Domain.Rights.User", "User")
+                        .WithMany("Policies")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 139 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/20201025000704_DoubleConversion_2.cs

@@ -0,0 +1,139 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace GreenTree.Strohrmann.ERP.Domain.Migrations
+{
+    public partial class DoubleConversion_2 : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<float>(
+                name: "Value",
+                table: "Taxes",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Value",
+                table: "EmployeeDegrees",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Value",
+                table: "CraftEmployees",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.AlterColumn<float>(
+                name: "Amount",
+                table: "CraftEmployees",
+                nullable: false,
+                oldClrType: typeof(decimal),
+                oldType: "decimal(65,30)");
+
+            migrationBuilder.UpdateData(
+                table: "EmployeeDegrees",
+                keyColumn: "Id",
+                keyValue: 1,
+                column: "Value",
+                value: 60f);
+
+            migrationBuilder.UpdateData(
+                table: "EmployeeDegrees",
+                keyColumn: "Id",
+                keyValue: 2,
+                column: "Value",
+                value: 30f);
+
+            migrationBuilder.UpdateData(
+                table: "EmployeeDegrees",
+                keyColumn: "Id",
+                keyValue: 3,
+                column: "Value",
+                value: 15f);
+
+            migrationBuilder.UpdateData(
+                table: "Taxes",
+                keyColumn: "Id",
+                keyValue: 1,
+                column: "Value",
+                value: 0.19f);
+
+            migrationBuilder.UpdateData(
+                table: "Taxes",
+                keyColumn: "Id",
+                keyValue: 2,
+                column: "Value",
+                value: 0.16f);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Value",
+                table: "Taxes",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Value",
+                table: "EmployeeDegrees",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Value",
+                table: "CraftEmployees",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.AlterColumn<decimal>(
+                name: "Amount",
+                table: "CraftEmployees",
+                type: "decimal(65,30)",
+                nullable: false,
+                oldClrType: typeof(float));
+
+            migrationBuilder.UpdateData(
+                table: "EmployeeDegrees",
+                keyColumn: "Id",
+                keyValue: 1,
+                column: "Value",
+                value: 60m);
+
+            migrationBuilder.UpdateData(
+                table: "EmployeeDegrees",
+                keyColumn: "Id",
+                keyValue: 2,
+                column: "Value",
+                value: 30m);
+
+            migrationBuilder.UpdateData(
+                table: "EmployeeDegrees",
+                keyColumn: "Id",
+                keyValue: 3,
+                column: "Value",
+                value: 15m);
+
+            migrationBuilder.UpdateData(
+                table: "Taxes",
+                keyColumn: "Id",
+                keyValue: 1,
+                column: "Value",
+                value: 0.19m);
+
+            migrationBuilder.UpdateData(
+                table: "Taxes",
+                keyColumn: "Id",
+                keyValue: 2,
+                column: "Value",
+                value: 0.16m);
+        }
+    }
+}

+ 30 - 30
GreenTree.Strohrmann.ERP.Domain/Migrations/ERPDbContextModelSnapshot.cs

@@ -62,8 +62,8 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                         .ValueGeneratedOnAdd()
                         .HasColumnType("int");
 
-                    b.Property<decimal>("Amount")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Amount")
+                        .HasColumnType("float");
 
                     b.Property<string>("Comment")
                         .HasColumnType("longtext CHARACTER SET utf8mb4");
@@ -74,8 +74,8 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<int>("EmployeeId")
                         .HasColumnType("int");
 
-                    b.Property<decimal>("Value")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
 
                     b.HasKey("Id");
 
@@ -94,14 +94,14 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<int>("MaterialId")
                         .HasColumnType("int");
 
-                    b.Property<decimal>("Amount")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Amount")
+                        .HasColumnType("float");
 
-                    b.Property<decimal>("CalculationFactor")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("CalculationFactor")
+                        .HasColumnType("float");
 
-                    b.Property<decimal>("Value")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
 
                     b.HasKey("CraftId", "MaterialId");
 
@@ -232,8 +232,8 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<int>("Order")
                         .HasColumnType("int");
 
-                    b.Property<decimal>("Value")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
 
                     b.HasKey("Id");
 
@@ -245,21 +245,21 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                             Id = 1,
                             Name = "Meister",
                             Order = 3,
-                            Value = 60m
+                            Value = 60f
                         },
                         new
                         {
                             Id = 2,
                             Name = "Geselle",
                             Order = 2,
-                            Value = 30m
+                            Value = 30f
                         },
                         new
                         {
                             Id = 3,
                             Name = "Aushilfe",
                             Order = 1,
-                            Value = 15m
+                            Value = 15f
                         });
                 });
 
@@ -285,15 +285,15 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<int>("DefaultUnitId")
                         .HasColumnType("int");
 
-                    b.Property<decimal>("Depth")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Depth")
+                        .HasColumnType("float");
 
                     b.Property<string>("Description")
                         .IsRequired()
                         .HasColumnType("longtext CHARACTER SET utf8mb4");
 
-                    b.Property<decimal>("Height")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Height")
+                        .HasColumnType("float");
 
                     b.Property<string>("ItemNumber")
                         .IsRequired()
@@ -303,19 +303,19 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                         .IsRequired()
                         .HasColumnType("longtext CHARACTER SET utf8mb4");
 
-                    b.Property<decimal>("NetValue")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("NetValue")
+                        .HasColumnType("float");
 
-                    b.Property<decimal>("PackageSize")
+                    b.Property<float>("PackageSize")
                         .ValueGeneratedOnAdd()
-                        .HasColumnType("decimal(65,30)")
-                        .HasDefaultValue(1m);
+                        .HasColumnType("float")
+                        .HasDefaultValue(1f);
 
                     b.Property<int>("SupplierId")
                         .HasColumnType("int");
 
-                    b.Property<decimal>("Width")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Width")
+                        .HasColumnType("float");
 
                     b.HasKey("Id");
 
@@ -402,8 +402,8 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                         .IsRequired()
                         .HasColumnType("longtext CHARACTER SET utf8mb4");
 
-                    b.Property<decimal>("Value")
-                        .HasColumnType("decimal(65,30)");
+                    b.Property<float>("Value")
+                        .HasColumnType("float");
 
                     b.HasKey("Id");
 
@@ -415,14 +415,14 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                             Id = 1,
                             Name = "Deutschland Umsatzsteuer",
                             ShortName = "Umst. (19%)",
-                            Value = 0.19m
+                            Value = 0.19f
                         },
                         new
                         {
                             Id = 2,
                             Name = "Deutschland Umsatzsteuer 2020",
                             ShortName = "Umst. (16%) 2020",
-                            Value = 0.16m
+                            Value = 0.16f
                         });
                 });
 

+ 3 - 3
GreenTree.Strohrmann.ERP.Domain/Model/Business/EmployeeDegreeMapping.cs

@@ -28,9 +28,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Model.Business
                 .IsRequired();
 
             builder.HasData(
-                new EmployeeDegree(1, "Meister", 60m, 3),
-                new EmployeeDegree(2, "Geselle", 30m, 2),
-                new EmployeeDegree(3, "Aushilfe", 15m, 1));
+                new EmployeeDegree(1, "Meister", 60f, 3),
+                new EmployeeDegree(2, "Geselle", 30f, 2),
+                new EmployeeDegree(3, "Aushilfe", 15f, 1));
         }
     }
 }

+ 2 - 2
GreenTree.Strohrmann.ERP.Domain/Model/Business/TaxMapping.cs

@@ -28,8 +28,8 @@ namespace GreenTree.Strohrmann.ERP.Domain.Model.Business
                 .IsRequired();
 
             builder.HasData(
-                new Tax(1, "Deutschland Umsatzsteuer", "Umst. (19%)", 0.19m),
-                new Tax(2, "Deutschland Umsatzsteuer 2020", "Umst. (16%) 2020", 0.16m));
+                new Tax(1, "Deutschland Umsatzsteuer", "Umst. (19%)", 0.19f),
+                new Tax(2, "Deutschland Umsatzsteuer 2020", "Umst. (16%) 2020", 0.16f));
         }
     }
 }

+ 5 - 0
GreenTree.Strohrmann.ERP.Services/Geolocator/GoogleApiOptions.cs

@@ -10,5 +10,10 @@ namespace GreenTree.Strohrmann.ERP.Services.Geolocator
         /// The Google provided API key
         /// </summary>
         public string ApiKey { get; set; }
+
+        /// <summary>
+        /// <i>True</i> to enable the Geocoding service to validate the address
+        /// </summary>
+        public bool Enabled { get; set; }
     }
 }

+ 3 - 0
GreenTree.Strohrmann.ERP.Services/Geolocator/GoogleGeocodingService.cs

@@ -68,6 +68,9 @@ namespace GreenTree.Strohrmann.ERP.Services.Geolocator
         /// </param>
         public bool IsValidAddress(string searchString, string[] addressComponents)
         {
+            if (!_googleApiOptions.Enabled)
+                return true;
+
             if (addressComponents == null)
                 return true;
 

+ 1 - 13
GreenTree.Strohrmann.ERP.Web/Configuration/DefaultOptionMonitoringService.cs

@@ -11,24 +11,12 @@ namespace GreenTree.Strohrmann.ERP.Web.Configuration
 {
     public class DefaultOptionMonitoringService : IOptionMonitoringService
     {
-        #region DI fields
-
-
-
-        #endregion
-
         #region Ctor
 
         public DefaultOptionMonitoringService(
-            IServiceProvider serviceProvider,
-            IOptionsMonitor<CultureOptions> cultureOptions)
+            IServiceProvider serviceProvider)
         {
-            cultureOptions.OnChange(config =>
-            {
-                var requestLocalizationOptions = serviceProvider.GetService<RequestLocalizationOptions>();
-
 
-            });
         }
 
         #endregion

+ 11 - 11
GreenTree.Strohrmann.ERP.Web/Controllers/CraftController.cs

@@ -85,7 +85,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                     if (item.Value.Amount % 1 != 0)
                         item.Value.Amount /= 10;
 
-                    item.Value.CalculationFactor = item.Value.CalculationFactor / 100;
+                    item.Value.CalculationFactor = item.Value.CalculationFactor;
                 }
 
                 return View(model);
@@ -108,7 +108,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                         Craft = craft,
                         Employee = _eRPDbContext.Employees.Find(ce.Value.EmployeeId),
                         Amount = ce.Value.Amount,
-                        Value = Convert.ToDecimal(ce.Value.Value),
+                        Value = ce.Value.Value,
                         Comment = ce.Value.Comment
                     }));
 
@@ -120,8 +120,8 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                         Craft = craft,
                         Material = _eRPDbContext.Materials.Find(cm.Key),
                         Amount = cm.Sum(v => v.Value.Amount),
-                        CalculationFactor = cm.Average(v => v.Value.CalculationFactor / 100),
-                        Value = cm.Sum(v => Convert.ToDecimal(v.Value.Value))
+                        CalculationFactor = cm.Average(v => v.Value.CalculationFactor),
+                        Value = cm.Sum(v => v.Value.Value)
                     }));
 
             _eRPDbContext.Crafts.Add(craft);
@@ -157,7 +157,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                     if (item.Value.Amount % 1 != 0)
                         item.Value.Amount /= 10;
 
-                    item.Value.CalculationFactor = item.Value.CalculationFactor / 100;
+                    item.Value.CalculationFactor = item.Value.CalculationFactor;
                 }
 
                 return View(model);
@@ -181,7 +181,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                         Craft = craft,
                         Employee = _eRPDbContext.Employees.Find(ce.Value.EmployeeId),
                         Amount = ce.Value.Amount,
-                        Value = Convert.ToDecimal(ce.Value.Value),
+                        Value = ce.Value.Value,
                         Comment = ce.Value.Comment
                     }));
 
@@ -193,8 +193,8 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                         Craft = craft,
                         Material = _eRPDbContext.Materials.Find(cm.Key),
                         Amount = cm.Sum(v => v.Value.Amount),
-                        CalculationFactor = cm.Average(v => v.Value.CalculationFactor / 100),
-                        Value = cm.Sum(v => Convert.ToDecimal(v.Value.Value))
+                        CalculationFactor = cm.Average(v => v.Value.CalculationFactor),
+                        Value = cm.Sum(v => v.Value.Value)
                     }));
 
             _eRPDbContext.SaveChanges();
@@ -235,7 +235,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
         {
             AddMaterialListForSelection();
 
-            craftMaterialModel.CalculationFactor = 1.2m;
+            craftMaterialModel.CalculationFactor = 1.2f;
 
             return PartialView("~/Views/Craft/_CraftMaterialPartial.cshtml", craftMaterialModel);
         }
@@ -271,7 +271,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                 return Ok(0);
 
             var material = _eRPDbContext.Materials.Find(craftMaterialModel.MaterialId);
-            var result = material.NetValue * craftMaterialModel.Amount * (craftMaterialModel.CalculationFactor / 100);
+            var result = Math.Round(material.NetValue * craftMaterialModel.Amount * (craftMaterialModel.CalculationFactor / 100), 2);
 
             return Ok(result);
         }
@@ -287,7 +287,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                 return Ok(0);
 
             var material = _eRPDbContext.Materials.Find(craftMaterialModel.MaterialId);
-            var result = Convert.ToDecimal(craftMaterialModel.Value) / (material.NetValue * craftMaterialModel.Amount) * 100;
+            var result = craftMaterialModel.Value / (material.NetValue * craftMaterialModel.Amount);
 
             return Ok(result);
         }

+ 2 - 2
GreenTree.Strohrmann.ERP.Web/Controllers/MaterialController.cs

@@ -96,7 +96,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                 Name = model.Name,
                 Description = model.Description,
                 ItemNumber = model.ItemNumber,
-                NetValue = Convert.ToDecimal(model.NetValue),
+                NetValue = model.NetValue,
                 Height = model.Height,
                 Width = model.Width,
                 Depth = model.Depth,
@@ -154,7 +154,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
             material.Name = model.Name;
             material.Description = model.Description;
             material.ItemNumber = model.ItemNumber;
-            material.NetValue = Convert.ToDecimal(model.NetValue);
+            material.NetValue = model.NetValue;
             material.Height = model.Height;
             material.Width = model.Width;
             material.Depth = model.Depth;

+ 3 - 3
GreenTree.Strohrmann.ERP.Web/Extension/HtmlContentExtension.cs

@@ -216,10 +216,10 @@ namespace GreenTree.Strohrmann.ERP.Web.Extension
 
             foreach (var country in countries)
             {
-                if (country.EnglishName == funcVal)
-                    selectBuilder.AppendFormat("<option selected value=\"{0}\">{1}</option>", country.EnglishName, country.DisplayName);
+                if (country.DisplayName == funcVal)
+                    selectBuilder.AppendFormat("<option selected value=\"{0}\">{1}</option>", country.DisplayName, country.DisplayName);
                 else
-                    selectBuilder.AppendFormat("<option value=\"{0}\">{1}</option>", country.EnglishName, country.DisplayName);
+                    selectBuilder.AppendFormat("<option value=\"{0}\">{1}</option>", country.DisplayName, country.DisplayName);
             }
 
             selectBuilder.Append("</select>");

+ 21 - 2
GreenTree.Strohrmann.ERP.Web/Models/Business/CraftEmployeeModel.cs

@@ -55,7 +55,25 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// The amount of employee working hours
         /// </summary>
         [Display(Name = "Menge / Dauer")]
-        public decimal Amount { get; set; }
+        public float Amount 
+        {
+            get
+            {
+                return String.IsNullOrEmpty(AmountText) 
+                    ? 0 
+                    : Convert.ToSingle(AmountText.Replace('.',','));
+            }
+            set
+            {
+                AmountText = value.ToString();
+            }
+        }
+
+        /// <summary>
+        /// The amount of employee working hours as text
+        /// </summary>
+        [Display(Name = "Menge / Dauer")]
+        public string AmountText { get; set; }
 
         /// <summary>
         /// The value of the employee working hours
@@ -90,8 +108,9 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
             Id = craftEmployee.Id;
             CraftId = craftEmployee.CraftId;
             EmployeeId = craftEmployee.EmployeeId;
+            Employee = new EmployeeModel(craftEmployee.Employee);
             Amount = craftEmployee.Amount;
-            Value = Convert.ToSingle(craftEmployee.Value);
+            Value = craftEmployee.Value;
             Comment = craftEmployee.Comment;
         }
 

+ 17 - 4
GreenTree.Strohrmann.ERP.Web/Models/Business/CraftMaterialModel.cs

@@ -56,14 +56,27 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// The amount of the material
         /// </summary>
         [Display(Name = "Menge")]
-        public decimal Amount { get; set; }
+        public float Amount { get; set; }
 
         /// <summary>
         /// The material calculation factor
         /// </summary>
         [Display(Name = "Kalkulationsfaktor")]
-        [DisplayFormat(DataFormatString = "{0:P0}")]
-        public decimal CalculationFactor { get; set; }
+        [DisplayFormat(DataFormatString = "{0:P1}")]
+        public float CalculationFactor { get; set; }
+
+        /// <summary>
+        /// The material calculation factor
+        /// </summary>
+        [Display(Name = "Kalkulationsfaktor")]
+        [DisplayFormat(DataFormatString = "{0:P2}")]
+        public float CalculationFactorUncalculated 
+        {
+            get
+            {
+                return CalculationFactor / 100;
+            }
+        }
 
         /// <summary>
         /// The value of the employee working hours
@@ -94,7 +107,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
             Amount = craftMaterial.Amount;
             MaterialText = craftMaterial.Material.Name;
             CalculationFactor = craftMaterial.CalculationFactor;
-            Value = Convert.ToSingle(craftMaterial.Value);
+            Value = craftMaterial.Value;
         }
 
         #endregion

+ 4 - 1
GreenTree.Strohrmann.ERP.Web/Models/Business/CraftModel.cs

@@ -1,5 +1,6 @@
 using GreenTree.Strohrmann.ERP.Core.Domain.Business;
 using GreenTree.Strohrmann.ERP.Web.Extension;
+using GreenTree.Strohrmann.ERP.Web.Models.Shared;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.ViewFeatures;
 using Microsoft.EntityFrameworkCore.Internal;
@@ -11,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace GreenTree.Strohrmann.ERP.Web.Models.Business
 {
-    public class CraftModel
+    public class CraftModel : TrackingModel
     {
         #region Properties
 
@@ -123,6 +124,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// </summary>
         /// <param name="craft">The base craft.</param>
         public CraftModel(Craft craft)
+            : base(craft)
         {
             if (craft == null) return;
 
@@ -133,6 +135,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
             CustomerText = Customer.Fullname;
             CustomerId = craft.Customer.Id;
             Comment = craft.Comment;
+
             CraftEmployees = craft.CraftEmployees
                 .Select(ce => new CraftEmployeeModel(ce))
                 .ToDictionary(ce => HtmlContentExtension.RandomId(), ce => ce);

+ 1 - 0
GreenTree.Strohrmann.ERP.Web/Models/Business/CustomerModel.cs

@@ -1,5 +1,6 @@
 using GreenTree.Strohrmann.ERP.Core.Domain.Rights;
 using GreenTree.Strohrmann.ERP.Web.Models.Shared;
+using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;

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

@@ -28,7 +28,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// Degree value
         /// </summary>
         [Display(Name = "Stundenwert (in Euro)")]
-        public decimal Value { get; set; }
+        public float Value { get; set; }
 
         /// <summary>
         /// Degree order

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

@@ -31,6 +31,18 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         [Display(Name = "Nachname")]
         public string Lastname { get; set; }
 
+        /// <summary>
+        /// Employee full name
+        /// </summary>
+        [Display(Name = "Voller Name")]
+        public string Fullname
+        {
+            get
+            {
+                return String.Format("{0} {1}", Firstname, Lastname);
+            }
+        }
+
         /// <summary>
         /// Employee mail address
         /// </summary>

+ 5 - 5
GreenTree.Strohrmann.ERP.Web/Models/Business/MaterialModel.cs

@@ -47,19 +47,19 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// Material height
         /// </summary>
         [Display(Name = "Höhe")]
-        public decimal Height { get; set; }
+        public float Height { get; set; }
 
         /// <summary>
         /// Material width
         /// </summary>
         [Display(Name = "Breite")]
-        public decimal Width { get; set; }
+        public float Width { get; set; }
 
         /// <summary>
         /// Material depth
         /// </summary>
         [Display(Name = "Tiefe")]
-        public decimal Depth { get; set; }
+        public float Depth { get; set; }
 
         /// <summary>
         /// Material dimensions (read only)
@@ -83,7 +83,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// The amount of items per package
         /// </summary>
         [Display(Name = "Packungsgröße / -menge")]
-        public decimal PackageSize { get; set; }
+        public float PackageSize { get; set; }
 
         /// <summary>
         /// Material supplier
@@ -139,7 +139,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
             Name = material.Name;
             ItemNumber = material.ItemNumber;
             Description = material.Description;
-            NetValue = Convert.ToSingle(material.NetValue);
+            NetValue = material.NetValue;
             Height = material.Height;
             Width = material.Width;
             Depth = material.Depth;

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

@@ -32,7 +32,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Models.Business
         /// Tax percentage value
         /// </summary>
         [Display(Name = "Steuersatz (in %)")]
-        public decimal Value { get; set; }
+        public float Value { get; set; }
 
         #endregion
 

+ 24 - 0
GreenTree.Strohrmann.ERP.Web/Models/CustomerModelBinder.cs

@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.Models
+{
+    public class CustomerModelBinder : IModelBinder
+    {
+        public Task BindModelAsync(ModelBindingContext bindingContext)
+        {
+            if (bindingContext == null)
+            {
+                throw new ArgumentNullException(nameof(bindingContext));
+            }
+
+            // Try to fetch the value of the argument by name
+            var valueProviderResult = bindingContext.ValueProvider.GetValue("Lastname");
+
+            return Task.CompletedTask;
+        }
+    }
+}

+ 28 - 0
GreenTree.Strohrmann.ERP.Web/Models/CustomerModelBinderProvider.cs

@@ -0,0 +1,28 @@
+using GreenTree.Strohrmann.ERP.Web.Models.Business;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.Models
+{
+    public class CustomerModelBinderProvider : IModelBinderProvider
+    {
+        public IModelBinder GetBinder(ModelBinderProviderContext context)
+        {
+            if (context == null)
+            {
+                throw new ArgumentNullException(nameof(context));
+            }
+
+            if (context.Metadata.ModelType == typeof(CustomerModel))
+            {
+                return new BinderTypeModelBinder(typeof(CustomerModelBinder));
+            }
+
+            return null;
+        }
+    }
+}

+ 5 - 1
GreenTree.Strohrmann.ERP.Web/Startup.cs

@@ -13,6 +13,7 @@ using GreenTree.Strohrmann.ERP.Services.Geolocator;
 using GreenTree.Strohrmann.ERP.Services.Localization;
 using GreenTree.Strohrmann.ERP.Services.Notification;
 using GreenTree.Strohrmann.ERP.Web.Configuration;
+using GreenTree.Strohrmann.ERP.Web.Models;
 using Microsoft.AspNetCore.Authentication;
 using Microsoft.AspNetCore.Authentication.Cookies;
 using Microsoft.AspNetCore.Authorization;
@@ -73,7 +74,10 @@ namespace GreenTree.Strohrmann.ERP.Web
         public void ConfigureServices(IServiceCollection services)
         {
             // Add MVC controller and views
-            services.AddControllersWithViews();
+            services.AddControllersWithViews(options =>
+            {
+                //options.ModelBinderProviders.Insert(0, new CustomerModelBinderProvider());
+            });
 
             // Add option handling
             services.AddOptions();

+ 337 - 0
GreenTree.Strohrmann.ERP.Web/Views/Craft/Details.cshtml

@@ -0,0 +1,337 @@
+@model GreenTree.Strohrmann.ERP.Web.Models.Business.CraftModel
+
+@{
+    ViewData["Title"] = "Kundendetails";
+}
+
+<h1>Werksdetails</h1>
+
+<h4>@Model.Name</h4>
+
+<hr />
+
+<div class="row">
+    <div class="col-4 pr-1">
+        <div class="card h-100">
+            <div class="card-header pb-1">
+                <h6>Allgemein</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.Name)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.Name)
+                    </dd>
+                    <dt class = "col-sm-6">
+                        @Html.DisplayNameFor(model => model.CreationDate)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.CreationDate)
+                    </dd>
+                    <dt class = "col-sm-6">
+                        @Html.DisplayNameFor(model => model.Customer)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.CustomerText)
+                    </dd>
+                    <dt class = "col-sm-6">
+                        @Html.DisplayNameFor(model => model.Comment)
+                    </dt>
+                    <dd class = "col-sm-6">
+                        @Html.DisplayFor(model => model.Comment)
+                    </dd>
+                </dl>
+            </div>
+        </div>
+    </div>
+    <div class="col-8">
+        <div class="card">
+            <div class="card-header pb-1">
+                <h6 class="float-left">Arbeitsstunden</h6>
+            </div>
+            <div id="craftemployeelist" class="card-body">
+                <table class="table">
+                    @if (Model != null && Model.CraftEmployees != null && Model.CraftEmployees.Count > 0)
+				    {
+                        <thead>
+                            <tr class="row">
+                                <th class="col-4">
+                                    @Html.DisplayNameFor(model => model.CraftEmployees.First().Value.Employee)
+                                </th>
+                                <th class="col-2">
+                                    @Html.DisplayNameFor(model => model.CraftEmployees.First().Value.Amount)
+                                </th>
+                                <th class="col-2">
+                                    @Html.DisplayNameFor(model => model.CraftEmployees.First().Value.Value)
+                                </th>
+                                <th class="col-4">
+                                    @Html.DisplayNameFor(model => model.CraftEmployees.First().Value.Comment)
+                                </th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            @foreach (var item in Model.CraftEmployees)
+						    {
+                                <tr class="row">
+                                    <td class="col-4">
+                                        @Html.DisplayFor(model => item.Value.Employee.Fullname)
+                                    </td>
+                                    <td class="col-2">
+                                        @Html.DisplayFor(model => item.Value.Amount)
+                                        <span class="ml-1">Std.</span>
+                                    </td>
+                                    <td class="col-2">
+                                        @Html.DisplayFor(model => item.Value.Value)
+                                    </td>
+                                    <td class="col-4">
+                                        @Html.DisplayFor(model => item.Value.Comment)
+                                    </td>
+                                </tr>
+						    }
+                        </tbody>
+					}
+					else
+					{
+                        <tbody>
+                            <tr class="row">
+                                Keine Stunden eingetragen
+                            </tr>
+                        </tbody>
+					}
+                </table>
+            </div>
+            <div class="card-footer">
+                <div class="row">
+                    <div class="col-4">
+                        <h5 class="mb-0">
+                            <span class="badge badge-info">
+                                <span class="fa fa-hashtag" aria-label="Anzahl"> </span>
+                                @if (Model != null && Model.CraftEmployees != null)
+				                {
+                                    <span id="aggEmployeeCount">
+                                        @Model.CraftEmployees.Values.Count
+                                    </span>
+				                }
+				                else
+				                {
+                                    <span id="aggEmployeeCount">1</span>
+				                }
+                            </span>
+                        </h5>
+                    </div>
+                    <div class="col-2">
+                        <h5 class="mb-0">
+                            <span class="badge badge-info">
+                                <img height="14" src="~/img/icon-average-48.png" alt="Durchschnitt" title="Durchschnitt" />
+                                @if (Model != null && Model.CraftEmployees != null)
+				                {
+                                    <span id="aggEmployeeAmountAvg">
+                                        @String.Format("{0:G29} Std.", Model.CraftEmployees.Values.Average(m => m.Amount))
+                                    </span>
+				                }
+				                else
+				                {
+                                    <span id="aggEmployeeAmountAvg"> -</span>
+				                }
+                            </span>
+                        </h5>
+                    </div>
+                    <div class="col-6">
+                        <h5 class="mb-0">
+                            <span class="badge badge-info">
+                                <img height="14" src="~/img/icon-sigma-48.png" alt="Summe" title="Summe" />
+                                @if (Model != null && Model.CraftEmployees != null)
+				                {
+                                    <span id="aggEmployeeValueSum">
+                                        @String.Format("{0} €", Model.CraftEmployees.Values.Sum(m => m.Value))
+                                    </span>
+				                }
+				                else
+				                {
+                                    <span id="aggEmployeeValueSum"> -</span>
+				                }
+                            </span>
+                        </h5>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="card mt-3">
+            <div class="card-header pb-1">
+                <h6 class="float-left">Materialien</h6>
+            </div>
+            <div id="craftmateriallist" class="card-body">
+                <table class="table">
+                    @if (Model != null && Model.CraftMaterials != null && Model.CraftMaterials.Count > 0)
+				    {
+                        <thead>
+                            <tr class="row">
+                                <th class="col-4">
+                                    @Html.DisplayNameFor(model => model.CraftMaterials.First().Value.Material)
+                                </th>
+                                <th class="col-2">
+                                    @Html.DisplayNameFor(model => model.CraftMaterials.First().Value.Amount)
+                                </th>
+                                <th class="col-2">
+                                    @Html.DisplayNameFor(model => model.CraftMaterials.First().Value.CalculationFactor)
+                                </th>
+                                <th class="col-4">
+                                    @Html.DisplayNameFor(model => model.CraftMaterials.First().Value.Value)
+                                </th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            @foreach (var item in Model.CraftMaterials)
+						    {
+                                <tr class="row">
+                                    <td class="col-4">
+                                        @Html.DisplayFor(model => item.Value.MaterialText)
+                                    </td>
+                                    <td class="col-2">
+                                        @Html.DisplayFor(model => item.Value.Amount)
+                                        @Html.DisplayFor(model => item.Value.Material.DefaultUnit.ShortName)
+                                    </td>
+                                    <td class="col-2">
+                                        @Html.DisplayFor(model => item.Value.CalculationFactorUncalculated)
+                                    </td>
+                                    <td class="col-4">
+                                        @Html.DisplayFor(model => item.Value.Value)
+                                    </td>
+                                </tr>
+						    }
+                        </tbody>
+					}
+					else
+					{
+                        <tbody>
+                            Keine Materialien verwendet
+                        </tbody>
+					}
+                </table>
+            </div>
+            <div class="card-footer">
+                <div class="row">
+                    <div class="col-4">
+                        <h5 class="mb-0">
+                            <span class="badge badge-info">
+                                <span class="fa fa-hashtag" aria-label="Anzahl"> </span>
+                                @if (Model != null && Model.CraftMaterials != null)
+				                {
+                                    <span id="aggMaterialCount">
+                                        @Model.CraftMaterials.Values.Count
+                                    </span>
+				                }
+				                else
+				                {
+                                    <span id="aggMaterialCount">1</span>
+				                }
+                            </span>
+                        </h5>
+                    </div>
+                    <div class="col-2">
+                    </div>
+                    <div class="col-2">
+                        <h5 class="mb-0">
+                            <span class="badge badge-info">
+                                <img height="14" src="~/img/icon-average-48.png" alt="Durchschnitt" title="Durchschnitt" />
+                                @if (Model != null && Model.CraftMaterials != null)
+				                {
+                                    <span id="aggMaterialCalculationFactorAvg">
+                                        @String.Format("{0:G29} %", Model.CraftMaterials.Values.Average(m => m.CalculationFactor))
+                                    </span>
+				                }
+				                else
+				                {
+                                    <span id="aggMaterialCalculationFactorAvg"> -</span>
+				                }
+                            </span>
+                        </h5>
+                    </div>
+                    <div class="col-4">
+                        <h5 class="mb-0">
+                            <span class="badge badge-info">
+                                <img height="14" src="~/img/icon-sigma-48.png" alt="Summe" title="Summe" />
+                                @if (Model != null && Model.CraftMaterials != null)
+				                {
+                                    <span id="aggMaterialValueSum">
+                                        @String.Format("{0} €", Model.CraftMaterials.Values.Sum(m => m.Value))
+                                    </span>
+				                }
+				                else
+				                {
+                                    <span id="aggMaterialValueSum"> -</span>
+				                }
+                            </span>
+                        </h5>
+                    </div>
+                </div>
+            </div>
+        </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.Name</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>

+ 1 - 1
GreenTree.Strohrmann.ERP.Web/Views/Craft/Edit.cshtml

@@ -174,7 +174,7 @@
                                         @if (Model != null && Model.CraftMaterials != null)
 				                        {
                                             <span id="aggMaterialCalculationFactorAvg">
-                                                @String.Format("{0:G29} %", Model.CraftMaterials.Values.Average(m => m.CalculationFactor) * 100)
+                                                @String.Format("{0:G29} %", Model.CraftMaterials.Values.Average(m => m.CalculationFactor))
                                             </span>
 				                        }
 				                        else

+ 11 - 5
GreenTree.Strohrmann.ERP.Web/Views/Craft/_CraftEmployeePartial.cshtml

@@ -5,6 +5,12 @@
 }
 
 <script type="text/javascript">
+    $(document).ready(function () {
+        setTimeout(function () {
+            $("input").restrictInput();
+        }, 500);
+    });
+
     @{ 
         <text>
 
@@ -14,7 +20,7 @@
                 url: "@Url.Action("CalculateEmployeeValue", "Craft")",
                 data: {
                     EmployeeId: $("select[name='CraftEmployees[@id].EmployeeId']").val(),
-                    Amount: $("input[name='CraftEmployees[@id].Amount']").val().replace('.', ',')
+                    AmountText: $("input[name='CraftEmployees[@id].AmountText']").val()
                 },
                 success: function (data) {
                     $("input[name='CraftEmployees[@id].Value']").val(data);
@@ -54,12 +60,12 @@
             <div class="input-group-prepend">
                 <span class="input-group-text">Std.</span>
             </div>
-            <input name="CraftEmployees[@id].Amount" type="number" min="0.00" step="0.50" class="form-control"
-                   id="CraftEmployees[@id].Amount" data-aggregation="employeeAmount"
-                   value="@(Model == null ? "0,00" : Model.Amount.ToString("G29"))"
+            <input name="CraftEmployees[@id].AmountText" type="text" class="form-control"
+                   id="CraftEmployees[@id].AmountText" data-aggregation="employeeAmount" data-restriction="numberOnly"
+                   value="@(Model == null ? 0.00f : Model.Amount)"
                    onchange="calculateEmployeeAggregation(); recalculateEmployeeValue_@id ();" />
         </div>
-        @Html.ValidationMessage(String.Format("CraftEmployees[{0}].Amount", id), new { @class = "text-danger" })
+        @Html.ValidationMessage(String.Format("CraftEmployees[{0}].AmountText", id), new { @class = "text-danger" })
     </div>
     <div class="form-group col-md-2">
         @if (Model == null || (Model != null && (!Model.Index.HasValue || Model.Index == 0)))

+ 3 - 3
GreenTree.Strohrmann.ERP.Web/Views/Craft/_CraftMaterialPartial.cshtml

@@ -33,7 +33,7 @@
                 data: {
                     MaterialId: $("input[name='CraftMaterials[@id].MaterialId']").val(),
                     Amount: $("input[name='CraftMaterials[@id].Amount']").val().replace('.', ','),
-                    CalculationFactor: $("input[name='CraftMaterials[@id].CalculationFactor']").val()
+                    CalculationFactor: $("input[name='CraftMaterials[@id].CalculationFactor']").val().replace('.', ',')
                 },
                 success: function (data) {
                     $("input[name='CraftMaterials[@id].Value']").val(data);
@@ -98,8 +98,8 @@
                 <span class="input-group-text">%</span>
             </div>
             <input asp-for="CalculationFactor" name="CraftMaterials[@id].CalculationFactor" 
-                   type="number" min="0" step="5"
-                   value="@((Model == null ? 120m : Model.CalculationFactor * 100m).TrimEnd().ToString().Replace(',','.'))" 
+                   type="number" min="0" step="0.5"
+                   value="@((Model == null ? 120f : Model.CalculationFactor).ToString().Replace(',','.'))" 
                    class="form-control" data-aggregation="materialCalculationFactor"
                    onchange="calculateMaterialAggregation(); recalculateMaterialValue_@id (this);" />
         </div>

+ 1 - 1
GreenTree.Strohrmann.ERP.Web/Views/Material/Details.cshtml

@@ -48,7 +48,7 @@
                     @Html.DisplayNameFor(model => model.DefaultUnit)
                 </dt>
                 <dd class = "col-sm-6">
-                    @Html.DisplayFor(model => model.DefaultUnit)
+                    @Html.DisplayFor(model => model.DefaultUnit.Name)
                 </dd>
                 <dt class = "col-sm-6">
                     @Html.DisplayNameFor(model => model.Height)

+ 3 - 2
GreenTree.Strohrmann.ERP.Web/appsettings.json

@@ -28,9 +28,10 @@
         "SmtpServerDomain": ""
     },
     "GoogleApiOptions": {
-        "ApiKey": "AIzaSyDJI7VrvPaCxG1u4rdEWoAjTfai2_6PWU4"
+        "ApiKey": "AIzaSyDJI7VrvPaCxG1u4rdEWoAjTfai2_6PWU4",
+        "Enabled": false
     },
     "CultureOptions": {
-        "DefaultCulture": "en-US"
+        "DefaultCulture": "de-DE"
     }
 }

+ 27 - 0
GreenTree.Strohrmann.ERP.Web/wwwroot/js/extension.js

@@ -20,6 +20,33 @@
     };
 })(jQuery)
 
+jQuery.fn.restrictInput = function () {
+    return this.each(function () {
+        var input = $(this);
+        var restriction = input.attr("data-restriction");
+
+        switch (restriction) {
+            case "numberOnly":
+                input.keydown(function (event) {
+                    var keyCode = ('which' in event) ? event.which : event.keyCode;
+
+                    isNumeric = (keyCode >= 48 /* KeyboardEvent.DOM_VK_0 */ && keyCode <= 57 /* KeyboardEvent.DOM_VK_9 */) ||
+                        (keyCode >= 96 /* KeyboardEvent.DOM_VK_NUMPAD0 */ && keyCode <= 105 /* KeyboardEvent.DOM_VK_NUMPAD9 */);
+
+                    isControlChar = keyCode === 8;
+                    isDecimalChar = keyCode === 188;
+
+                    modifiers = (event.altKey || event.ctrlKey || event.shiftKey);
+
+                    if ((!isNumeric && !isControlChar && !isDecimalChar) || modifiers) {
+                        event.preventDefault();
+                    }
+                });
+                break;
+        }
+    });
+};
+
 //************** Array extension **************//
 
 Array.prototype.sum = function () {