Selaa lähdekoodia

Erste Importfunktion fertiggestellt

Arne Diekmann 5 vuotta sitten
vanhempi
commit
7d204ccb16

+ 5 - 0
GreenTree.Strohrmann.ERP.Core/Domain/Shared/TrackedEntity.cs

@@ -28,6 +28,11 @@ namespace GreenTree.Strohrmann.ERP.Core.Domain.Shared
         /// </summary>
         public DateTime? ChangedOn { get; set; }
 
+        /// <summary>
+        /// Status of creation mode (created or imported)
+        /// </summary>
+        public string CreationStatus { get; set; }
+
         #endregion
     }
 }

+ 754 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/20201109232837_CreationStatus.Designer.cs

@@ -0,0 +1,754 @@
+// <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("20201109232837_CreationStatus")]
+    partial class CreationStatus
+    {
+        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<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    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>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    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<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    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<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    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>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+                    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
+        }
+    }
+}

+ 58 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/20201109232837_CreationStatus.cs

@@ -0,0 +1,58 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace GreenTree.Strohrmann.ERP.Domain.Migrations
+{
+    public partial class CreationStatus : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<string>(
+                name: "CreationStatus",
+                table: "Suppliers",
+                nullable: true);
+
+            migrationBuilder.AddColumn<string>(
+                name: "CreationStatus",
+                table: "Materials",
+                nullable: true);
+
+            migrationBuilder.AddColumn<string>(
+                name: "CreationStatus",
+                table: "Employees",
+                nullable: true);
+
+            migrationBuilder.AddColumn<string>(
+                name: "CreationStatus",
+                table: "Customers",
+                nullable: true);
+
+            migrationBuilder.AddColumn<string>(
+                name: "CreationStatus",
+                table: "Crafts",
+                nullable: true);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "CreationStatus",
+                table: "Suppliers");
+
+            migrationBuilder.DropColumn(
+                name: "CreationStatus",
+                table: "Materials");
+
+            migrationBuilder.DropColumn(
+                name: "CreationStatus",
+                table: "Employees");
+
+            migrationBuilder.DropColumn(
+                name: "CreationStatus",
+                table: "Customers");
+
+            migrationBuilder.DropColumn(
+                name: "CreationStatus",
+                table: "Crafts");
+        }
+    }
+}

+ 15 - 0
GreenTree.Strohrmann.ERP.Domain/Migrations/ERPDbContextModelSnapshot.cs

@@ -42,6 +42,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<DateTime>("CreationDate")
                         .HasColumnType("datetime(6)");
 
+                    b.Property<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
                     b.Property<int>("CustomerId")
                         .HasColumnType("int");
 
@@ -140,6 +143,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<DateTime>("CreatedOn")
                         .HasColumnType("datetime(6)");
 
+                    b.Property<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
                     b.Property<string>("Firstname")
                         .IsRequired()
                         .HasColumnType("longtext CHARACTER SET utf8mb4");
@@ -198,6 +204,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<DateTime>("CreatedOn")
                         .HasColumnType("datetime(6)");
 
+                    b.Property<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
                     b.Property<int>("EmployeeDegreeId")
                         .HasColumnType("int");
 
@@ -282,6 +291,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<DateTime>("CreatedOn")
                         .HasColumnType("datetime(6)");
 
+                    b.Property<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
                     b.Property<int>("DefaultUnitId")
                         .HasColumnType("int");
 
@@ -356,6 +368,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Migrations
                     b.Property<DateTime>("CreatedOn")
                         .HasColumnType("datetime(6)");
 
+                    b.Property<string>("CreationStatus")
+                        .HasColumnType("longtext CHARACTER SET utf8mb4");
+
                     b.Property<string>("Description")
                         .HasColumnType("longtext CHARACTER SET utf8mb4");
 

+ 3 - 0
GreenTree.Strohrmann.ERP.Domain/Model/Shared/TrackedEntityMapping.cs

@@ -23,6 +23,9 @@ namespace GreenTree.Strohrmann.ERP.Domain.Model.Shared
 
             builder.Property(t => t.ChangedBy)
                 .IsRequired(false);
+
+            builder.Property(t => t.CreationStatus)
+                .IsRequired(false);
         }
     }
 }

+ 74 - 2
GreenTree.Strohrmann.ERP.Web/Controllers/CustomerController.cs

@@ -1,14 +1,20 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
 using System.Linq;
 using System.Net.Http;
 using System.Threading.Tasks;
+using CsvHelper;
 using GreenTree.Strohrmann.ERP.Core.Domain.Business;
 using GreenTree.Strohrmann.ERP.Core.Helper;
 using GreenTree.Strohrmann.ERP.Domain.Model;
 using GreenTree.Strohrmann.ERP.Services.Geolocator;
 using GreenTree.Strohrmann.ERP.Web.Extension;
+using GreenTree.Strohrmann.ERP.Web.Helper;
+using GreenTree.Strohrmann.ERP.Web.ImportMaps;
 using GreenTree.Strohrmann.ERP.Web.Models.Business;
+using GreenTree.Strohrmann.ERP.Web.Models.Import;
 using GreenTree.Strohrmann.ERP.Web.Models.Rights.User;
 using GreenTree.Strohrmann.ERP.Web.Models.Shared;
 using Microsoft.AspNetCore.Http;
@@ -38,7 +44,7 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
 
         #endregion
 
-        #region Actions
+        #region CRUD
 
         // GET: CustomerController
         public ActionResult Index()
@@ -93,7 +99,8 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
                 Country = model.Country,
                 IsBusiness = model.IsBusiness,
                 CreatedBy = User.Identity.Name,
-                CreatedOn = DateTime.Now
+                CreatedOn = DateTime.Now,
+                CreationStatus = "Created"
             };
 
             _eRPDbContext.Customers.Add(customer);
@@ -163,6 +170,71 @@ namespace GreenTree.Strohrmann.ERP.Web.Controllers
 
         #endregion
 
+        #region Import
+
+        // GET: CustomerController/Import
+        public ActionResult Import()
+        {
+            return View();
+        }
+
+        // POST: CustomerController/CheckImport
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public ActionResult CheckImport(ImportModel model)
+        {
+            try
+            {
+                ImportHelper.CheckImport<Customer, CustomerMap>(model);
+
+                return Ok();
+            }
+            catch (ValidationException ex)
+            {
+                return Problem(ex.Message);
+            }
+            catch (Exception ex)
+            {
+                return Problem(ex.Message);
+            }
+        }
+
+        // POST: CustomerController/Import
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public ActionResult Import(ImportModel model)
+        {
+            try
+            {
+                var customers = ImportHelper.GetFromImport<Customer, CustomerMap>(model);
+
+                foreach (var customer in customers)
+                {
+                    customer.Id = 0;
+
+                    customer.CreationStatus = "Imported";
+                    customer.CreatedBy = User.Identity.Name;
+                    customer.CreatedOn = DateTime.Now;
+
+                    customer.Title = _eRPDbContext.Titles.Find(customer.Title.Id);
+
+                    if (customer.Tax.Id == -1)
+                        customer.Tax = null;
+                }
+
+                _eRPDbContext.Customers.AddRange(customers);
+                _eRPDbContext.SaveChanges();
+
+                return View("~/Views/Import/ImportResult.cshtml", new ImportResultModel(customers.Count()));
+            }
+            catch (Exception ex)
+            {
+                return View("~/Views/Import/ImportResult.cshtml", new ImportResultModel(ex));
+            }
+        }
+
+        #endregion
+
         #region Partials
 
         // POST: CustomerController/Search/*term*

+ 1 - 0
GreenTree.Strohrmann.ERP.Web/GreenTree.Strohrmann.ERP.Web.csproj

@@ -7,6 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="CsvHelper" Version="15.0.9" />
     <PackageReference Include="FluentValidation.AspNetCore" Version="8.6.2" />
     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.5" />
     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.5">

+ 116 - 0
GreenTree.Strohrmann.ERP.Web/Helper/ImportHelper.cs

@@ -0,0 +1,116 @@
+using CsvHelper;
+using GreenTree.Strohrmann.ERP.Web.Models.Import;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.Helper
+{
+    public static class ImportHelper
+    {
+        /// <summary>
+        /// Checks an ImportModel instance for a valid import file for the specified data type <typeparamref name="T"/>
+        /// </summary>
+        /// <typeparam name="TEntity">The data type.</typeparam>
+        /// <param name="model">The import model.</param>
+        public static void CheckImport<TEntity>(ImportModel model)
+        {
+            CheckImport<TEntity, TEntity>(model);
+        }
+
+        /// <summary>
+        /// Checks an ImportModel instance for a valid import file for the specified data type <typeparamref name="T"/>
+        /// </summary>
+        /// <typeparam name="TEntity">The data type.</typeparam>
+        /// <typeparam name="TMap">The data map type.</typeparam>
+        /// <param name="model">The import model.</param>
+        public static void CheckImport<TEntity, TMap>(ImportModel model)
+        {
+            if (model == null)
+                throw new ArgumentNullException("model", "The importModel must not be NULL.");
+
+            if (model.ImportFile == null)
+                throw new ArgumentException("The importModel does not contain a file.", "model");
+
+            var tempfile = Path.GetTempFileName();
+
+            using var writer = new FileStream(tempfile, FileMode.Append);
+
+            model.ImportFile.CopyTo(writer);
+
+            writer.Close();
+
+            using (var reader = new StreamReader(tempfile))
+            {
+                using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
+
+                csv.Configuration.Delimiter = ";";
+                csv.Configuration.BadDataFound = null;
+
+                if (typeof(TEntity) != typeof(TMap))
+                    csv.Configuration.RegisterClassMap(typeof(TMap));
+
+                csv.Read();
+                csv.ReadHeader();
+
+                csv.ValidateHeader<TEntity>();
+            }
+        }
+
+        /// <summary>
+        /// Gets an object collection of <typeparamref name="T"/> from the import file
+        /// </summary>
+        /// <typeparam name="TEntity">The data type.</typeparam>
+        /// <param name="model">The import model.</param>
+        public static IEnumerable<TEntity> GetFromImport<TEntity>(ImportModel model)
+        {
+            return GetFromImport<TEntity, TEntity>(model);
+        }
+
+        /// <summary>
+        /// Gets an object collection of <typeparamref name="T"/> from the import file
+        /// </summary>
+        /// <typeparam name="TEntity">The data type.</typeparam>
+        /// <typeparam name="TMap">The data map type.</typeparam>
+        /// <param name="model">The import model.</param>
+        public static IEnumerable<TEntity> GetFromImport<TEntity, TMap>(ImportModel model)
+        {
+            if (model == null)
+                throw new ArgumentNullException("model", "The importModel must not be NULL.");
+
+            if (model.ImportFile == null)
+                throw new ArgumentException("The importModel does not contain a file.", "model");
+
+            var tempfile = Path.GetTempFileName();
+
+            using var writer = new FileStream(tempfile, FileMode.Append);
+
+            model.ImportFile.CopyTo(writer);
+
+            writer.Close();
+
+            using (var reader = new StreamReader(tempfile))
+            {
+                using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
+
+                csv.Configuration.Delimiter = ";";
+                csv.Configuration.BadDataFound = null;
+
+                if (typeof(TEntity) != typeof(TMap))
+                    csv.Configuration.RegisterClassMap(typeof(TMap));
+
+                csv.Read();
+                csv.ReadHeader();
+
+                csv.ValidateHeader<TEntity>();
+
+                var result = csv.GetRecords<TEntity>().ToArray();
+
+                return result;
+            }
+        }
+    }
+}

+ 43 - 0
GreenTree.Strohrmann.ERP.Web/ImportMaps/CustomerMap.cs

@@ -0,0 +1,43 @@
+using CsvHelper.Configuration;
+using GreenTree.Strohrmann.ERP.Core.Domain.Business;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.ImportMaps
+{
+    public sealed class CustomerMap : ClassMap<Customer>
+    {
+        #region Ctor
+
+        /// <summary>
+        /// Initialzes a new instnce of the CustomerMap class
+        /// </summary>
+        public CustomerMap()
+        {
+            AutoMap(CultureInfo.InvariantCulture);
+
+            Map(m => m.Title.Id).Name("TitleId").Default(1);
+            Map(m => m.Title.Name).Ignore();
+
+            Map(m => m.Tax.Id).Name("TaxId").Default(-1);
+            Map(m => m.Tax.Name).Ignore();
+            Map(m => m.Tax.ShortName).Ignore();
+            Map(m => m.Tax.Value).Ignore();
+
+            Map(m => m.CreatedOn).Ignore();
+            Map(m => m.CreatedBy).Ignore();
+
+            Map(m => m.ChangedOn).Ignore();
+            Map(m => m.ChangedBy).Ignore();
+
+            Map(m => m.CreationStatus).Ignore();
+
+            Map(m => m.Crafts).Ignore();
+        }
+
+        #endregion
+    }
+}

+ 22 - 0
GreenTree.Strohrmann.ERP.Web/Models/Import/ImportModel.cs

@@ -0,0 +1,22 @@
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.Models.Import
+{
+    public class ImportModel
+    {
+        #region Properties
+
+        /// <summary>
+        /// The import file
+        /// </summary>
+        [Display(Name = "Importdatei")]
+        public IFormFile ImportFile { get; set; }
+
+        #endregion
+    }
+}

+ 51 - 0
GreenTree.Strohrmann.ERP.Web/Models/Import/ImportResultModel.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace GreenTree.Strohrmann.ERP.Web.Models.Import
+{
+    public class ImportResultModel
+    {
+        #region Properties
+
+        /// <summary>
+        /// The count of imported data objects
+        /// </summary>
+        public int ImportCount { get; set; }
+
+        /// <summary>
+        /// The import exception
+        /// </summary>
+        public Exception Error { get; set; }
+
+        #endregion
+
+        #region Ctor
+
+        /// <summary>
+        /// Initializes a new instance of the ImportResultModel class
+        /// </summary>
+        public ImportResultModel() { }
+
+        /// <summary>
+        /// Initializes a new instance of the ImportResultModel class
+        /// </summary>
+        /// <param name="importCount">The amount of imported data rows.</param>
+        public ImportResultModel(int importCount)
+        {
+            ImportCount = importCount;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the ImportResultModel class
+        /// </summary>
+        /// <param name="error">The exception thrown on the import.</param>
+        public ImportResultModel(Exception error)
+        {
+            Error = error;
+        }
+
+        #endregion
+    }
+}

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

@@ -58,7 +58,7 @@
                 <h6 class="float-left">Arbeitsstunden</h6>
             </div>
             <div id="craftemployeelist" class="card-body">
-                <table class="table">
+                <table class="table table-striped">
                     @if (Model != null && Model.CraftEmployees != null && Model.CraftEmployees.Count > 0)
 				    {
                         <thead>
@@ -169,7 +169,7 @@
                 <h6 class="float-left">Materialien</h6>
             </div>
             <div id="craftmateriallist" class="card-body">
-                <table class="table">
+                <table class="table table-striped">
                     @if (Model != null && Model.CraftMaterials != null && Model.CraftMaterials.Count > 0)
 				    {
                         <thead>

+ 70 - 0
GreenTree.Strohrmann.ERP.Web/Views/Customer/Import.cshtml

@@ -0,0 +1,70 @@
+@model GreenTree.Strohrmann.ERP.Web.Models.Import.ImportModel
+
+@{
+    ViewData["Title"] = "Kundenimport";
+}
+
+<script type="text/javascript">
+
+    function checkFile() {
+        $(".btn-primary").prop("disabled", true);
+
+        var form = $("form");
+        var formData = new FormData(form[0]);
+
+        if (formData.get("ImportFile").name == "") return;
+
+        $.ajax({
+            method: "POST",
+            url: '@Url.Action("CheckImport")',
+            data: formData,
+            contentType: false,
+            processData: false,
+            success: function (data) {
+                $(".alert-success").show("slow", function () { setTimeout(function (s) { $(s).hide("slow"); }, 5000, this); });
+                $(".btn-primary").prop("disabled", false);
+            },
+            error: function (error) {
+                $(".alert-danger").show("slow", function () { setTimeout(function (s) { $(s).hide("slow"); }, 20000, this); });
+                $(".alert-danger").find("b").text(error.responseJSON.detail);
+            }
+        });
+    }
+
+</script>
+
+<h1>Kunden importieren</h1>
+
+<hr />
+
+<h5>
+    Importieren Sie Kunden aus einer CSV-Datei mit bestehenden Kundendaten
+</h5>
+
+<form enctype="multipart/form-data" method="post" asp-action="Import">
+    <p>
+        <dl>
+            <dt>
+                <label asp-for="ImportFile"></label>
+            </dt>
+            <dd>
+                <input asp-for="ImportFile" type="file" onchange="checkFile(); return false;">
+                <span asp-validation-for="ImportFile"></span>
+            </dd>
+        </dl>
+        <input asp-page-handler="Upload" class="btn btn-primary" type="submit" value="Hochladen" />
+        <div class="mt-3">
+            <div class="alert alert-success collapse" role="alert">
+                <h4 class="alert-heading">Prüfung erfolgreich!</h4>
+                <p>Die ausgewählte Datei enthälte gültige Kundendaten und kann jetzt importiert werden.</p>
+            </div>
+            <div class="alert alert-danger collapse" role="alert">
+                <h4 class="alert-heading">Prüfung fehlerhaft!</h4>
+                <p>Die ausgewählte Datei ist ungültig. Bitte überprüfen Sie die Importdatei:
+                    <br />
+                    <b></b>
+                </p>
+            </div>
+        </div>
+    </p>
+</form>

+ 29 - 0
GreenTree.Strohrmann.ERP.Web/Views/Import/ImportResult.cshtml

@@ -0,0 +1,29 @@
+@model GreenTree.Strohrmann.ERP.Web.Models.Import.ImportResultModel
+
+@{
+    ViewData["Title"] = "Importergebnis";
+}
+
+<h1>Importergebnis</h1>
+
+<hr />
+
+<div class="mt-3">
+    @if (Model.Error != null)
+	{
+        <div class="alert alert-danger" role="alert">
+            <h4 class="alert-heading">Import fehlerhaft!</h4>
+            <p>Der konnte aufgrund folgenden Fehlers nicht erfolgreich abgeschlossen werden:
+                <br />
+                <b>@Model.Error.Message</b>
+            </p>
+        </div>
+	}
+	else
+	{
+        <div class="alert alert-success" role="alert">
+            <h4 class="alert-heading">Prüfung erfolgreich!</h4>
+            <p>Der Datenimport war erfolgreich. Es wurden <b>@Model.ImportCount</b> Datensätze erfolgreich importiert!</p>
+        </div>
+	}
+</div>