Merge pull request 'PerformanceOptimization' (#10) from PerformanceOptimization into BlazorServer

Reviewed-on: sascha/Gremlin#10
pull/1/head
Sascha Woitschetzki 2023-01-17 15:01:11 +07:00
commit f61a2989ea
14 changed files with 422 additions and 360 deletions

@ -7,8 +7,8 @@
{ {
"name": ".NET Core Launch (web)", "name": ".NET Core Launch (web)",
"type": "coreclr", "type": "coreclr",
"request": "launch",
"preLaunchTask": "build", "preLaunchTask": "build",
"request": "launch",
"program": "${workspaceFolder}/bin/Debug/net7.0/Gremlin_BlazorServer", "program": "${workspaceFolder}/bin/Debug/net7.0/Gremlin_BlazorServer",
"args": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
@ -19,7 +19,8 @@
"pattern": "\\bNow listening on:\\s+(https?://\\S+)" "pattern": "\\bNow listening on:\\s+(https?://\\S+)"
}, },
"env": { "env": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_URLS": "https://localhost:5000"
}, },
"sourceFileMap": { "sourceFileMap": {
"/Views": "${workspaceFolder}/Views" "/Views": "${workspaceFolder}/Views"

@ -8,39 +8,39 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<Account> accountEntity) public void Configure(EntityTypeBuilder<Account> accountEntity)
{ {
_ = accountEntity.HasKey(e => e.AccountId); accountEntity.HasKey(e => e.AccountId);
_ = accountEntity.HasMany(d => d.Contacts).WithOne(p => p.Account).IsRequired(); accountEntity.HasMany(d => d.Contacts).WithOne(p => p.Account).IsRequired();
_ = accountEntity.HasOne(d => d.AccountType).WithMany(p => p.Accounts).IsRequired().OnDelete(DeleteBehavior.Restrict); accountEntity.HasOne(d => d.AccountType).WithMany(p => p.Accounts).IsRequired().OnDelete(DeleteBehavior.Restrict);
_ = accountEntity.HasOne(d => d.SubMarket).WithMany(p => p.Accounts).IsRequired().OnDelete(DeleteBehavior.Restrict); accountEntity.HasOne(d => d.SubMarket).WithMany(p => p.Accounts).IsRequired().OnDelete(DeleteBehavior.Restrict);
_ = accountEntity.HasAlternateKey(e => e.SapAccountNumber); // =Unique accountEntity.HasAlternateKey(e => e.SapAccountNumber); // =Unique
_ = accountEntity.Property(e => e.AccountId).ValueGeneratedOnAdd(); accountEntity.Property(e => e.AccountId).ValueGeneratedOnAdd();
_ = accountEntity.Property(e => e.ParentAccountId).HasDefaultValue(0); accountEntity.Property(e => e.ParentAccountId).HasDefaultValue(0);
_ = accountEntity.Property(e => e.AccountName).IsRequired().HasMaxLength(250); accountEntity.Property(e => e.AccountName).IsRequired().HasMaxLength(250);
_ = accountEntity.Property(e => e.Notes).HasDefaultValue(""); accountEntity.Property(e => e.Notes).HasDefaultValue("");
_ = accountEntity.Property(e => e.Street).IsRequired().HasMaxLength(100); accountEntity.Property(e => e.Street).IsRequired().HasMaxLength(100);
_ = accountEntity.Property(e => e.Zip).IsRequired().HasColumnType("Char(5)"); accountEntity.Property(e => e.Zip).IsRequired().HasColumnType("Char(5)");
_ = accountEntity.Property(e => e.City).IsRequired().HasMaxLength(50); accountEntity.Property(e => e.City).IsRequired().HasMaxLength(50);
_ = accountEntity.Property(e => e.FloorOrBuilding).HasMaxLength(50); accountEntity.Property(e => e.FloorOrBuilding).HasMaxLength(50);
_ = accountEntity.Property(e => e.Longitude).HasDefaultValue(0); accountEntity.Property(e => e.Longitude).HasDefaultValue(0);
_ = accountEntity.Property(e => e.Latitude).HasDefaultValue(0); accountEntity.Property(e => e.Latitude).HasDefaultValue(0);
_ = accountEntity.Property(e => e.PhoneNumber).IsRequired().HasMaxLength(30); accountEntity.Property(e => e.PhoneNumber).IsRequired().HasMaxLength(30);
_ = accountEntity.Property(e => e.FaxNumber).HasMaxLength(30).HasDefaultValue(""); accountEntity.Property(e => e.FaxNumber).HasMaxLength(30).HasDefaultValue("");
_ = accountEntity.Property(e => e.Webpage).HasMaxLength(250).HasDefaultValue(""); accountEntity.Property(e => e.Webpage).HasMaxLength(250).HasDefaultValue("");
_ = accountEntity.Property(e => e.EMail).HasMaxLength(150).HasDefaultValue(""); accountEntity.Property(e => e.EMail).HasMaxLength(150).HasDefaultValue("");
_ = accountEntity.Property(e => e.SapAccountNumber).IsRequired(); accountEntity.Property(e => e.SapAccountNumber).IsRequired();
_ = accountEntity.Property(e => e.AccountCreatedInSapOn).IsRequired(); accountEntity.Property(e => e.AccountCreatedInSapOn).IsRequired();
_ = accountEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); accountEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = accountEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); accountEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = accountEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); accountEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = accountEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); accountEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = accountEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); accountEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = accountEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); accountEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
//.HasDefaultValue("Active") //Default-Wert wird nicht gesetzt?!? Bug in EF Core? //.HasDefaultValue("Active") //Default-Wert wird nicht gesetzt?!? Bug in EF Core?
_ = accountEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); accountEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
//.IsRowVersion() impliziert .ValueGeneratedOnAddOrUpdate() und .IsConcurrencyToken(true) //.IsRowVersion() impliziert .ValueGeneratedOnAddOrUpdate() und .IsConcurrencyToken(true)
_ = accountEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); accountEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -48,32 +48,35 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<Contact> contactEntity) public void Configure(EntityTypeBuilder<Contact> contactEntity)
{ {
_ = contactEntity.HasKey(e => e.ContactId); contactEntity.HasKey(e => e.ContactId);
_ = contactEntity.HasOne(p => p.Account).WithMany(d => d.Contacts).IsRequired(); contactEntity.HasOne(p => p.Account).WithMany(d => d.Contacts).IsRequired();
//SW
contactEntity.HasMany(q => q.Quotes).WithOne(c => c.Recipient);
//entity.HasAlternateKey(e => e.SAPContactNumber); //entity.HasAlternateKey(e => e.SAPContactNumber);
_ = contactEntity.Property(e => e.ContactId); contactEntity.Property(e => e.ContactId);
_ = contactEntity.Property(e => e.SapContactNumber).IsRequired(); contactEntity.Property(e => e.SapContactNumber).IsRequired();
_ = contactEntity.Property(e => e.AcademicTitle).HasDefaultValue(""); contactEntity.Property(e => e.AcademicTitle).HasDefaultValue("");
_ = contactEntity.Property(e => e.FirstName).HasDefaultValue(""); contactEntity.Property(e => e.FirstName).HasDefaultValue("");
_ = contactEntity.Property(e => e.LastName).IsRequired(); contactEntity.Property(e => e.LastName).IsRequired();
_ = contactEntity.Property(e => e.Gender).HasDefaultValue(0); contactEntity.Property(e => e.Gender).HasDefaultValue(0);
//.IsRequired(true) darf nicht gesetzt werden, da sonst vom DB-Engine NULL nicht erlaubt wird (trotz Definition als Bool? im Code. MySQL kennt kein Bool, sondern wandelt das intern in Tinyint um). //.IsRequired(true) darf nicht gesetzt werden, da sonst vom DB-Engine NULL nicht erlaubt wird (trotz Definition als Bool? im Code. MySQL kennt kein Bool, sondern wandelt das intern in Tinyint um).
_ = contactEntity.Property(e => e.OptInStatus).HasDefaultValue(false); contactEntity.Property(e => e.OptInStatus).HasDefaultValue(false);
_ = contactEntity.Property(e => e.IsReference).HasDefaultValue(false); contactEntity.Property(e => e.IsReference).HasDefaultValue(false);
_ = contactEntity.Property(e => e.Notes).HasDefaultValue(""); contactEntity.Property(e => e.Notes).HasDefaultValue("");
_ = contactEntity.Property(e => e.ValidatedContact).HasDefaultValue(false); contactEntity.Property(e => e.ValidatedContact).HasDefaultValue(false);
_ = contactEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); contactEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = contactEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); contactEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = contactEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); contactEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = contactEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); contactEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = contactEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); contactEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = contactEntity.Property(e => e.DataStatus).IsRequired(); contactEntity.Property(e => e.DataStatus).IsRequired();
//.HasDefaultValue("Active") //Default-Wert wird nicht gesetzt?!? Bug in EF Core? //.HasDefaultValue("Active") //Default-Wert wird nicht gesetzt?!? Bug in EF Core?
_ = contactEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); contactEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
//.IsRowVersion() impliziert .ValueGeneratedOnAddOrUpdate() und .IsConcurrencyToken(true) //.IsRowVersion() impliziert .ValueGeneratedOnAddOrUpdate() und .IsConcurrencyToken(true)
_ = contactEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); contactEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -81,33 +84,36 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<Quote> quoteEntity) public void Configure(EntityTypeBuilder<Quote> quoteEntity)
{ {
_ = quoteEntity.HasKey(e => e.QuoteId); quoteEntity.HasKey(e => e.QuoteId);
_ = quoteEntity.HasMany(d => d.LineItems).WithOne(p => p.Quote).IsRequired(false).OnDelete(DeleteBehavior.Cascade); quoteEntity.HasMany(d => d.LineItems).WithOne(p => p.Quote).IsRequired(false).OnDelete(DeleteBehavior.Cascade);
_ = quoteEntity.Property(e => e.QuotationNumber).HasColumnType("VARCHAR(255)").IsRequired().ValueGeneratedOnAdd(); quoteEntity.Property(e => e.QuotationNumber).HasColumnType("VARCHAR(255)").IsRequired().ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.QuotationDate).IsRequired().ValueGeneratedOnAdd(); quoteEntity.Property(e => e.QuotationDate).IsRequired().ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.ValidUntil); quoteEntity.Property(e => e.ValidUntil);
_ = quoteEntity.Property(e => e.ValidFor).IsRequired(); quoteEntity.Property(e => e.ValidFor).IsRequired();
_ = quoteEntity.Ignore("SalesRep"); //SW
quoteEntity.HasOne(e => e.Recipient).WithMany(c => c.Quotes);
_ = quoteEntity.Property(e => e.TotalListprice);
_ = quoteEntity.Property(e => e.TotalDiscount); quoteEntity.Ignore("SalesRep");
_ = quoteEntity.Property(e => e.TotalNet);
_ = quoteEntity.Property(e => e.Vat); quoteEntity.Property(e => e.TotalListprice);
_ = quoteEntity.Property(e => e.TotalGross); quoteEntity.Property(e => e.TotalDiscount);
_ = quoteEntity.Property(e => e.QuoteContains3Pp).HasDefaultValue(false); quoteEntity.Property(e => e.TotalNet);
_ = quoteEntity.Property(e => e.QuoteContainsRb).HasDefaultValue(false); quoteEntity.Property(e => e.Vat);
_ = quoteEntity.Property(e => e.QuoteTemplate).HasDefaultValue(""); quoteEntity.Property(e => e.TotalGross);
quoteEntity.Property(e => e.QuoteContains3Pp).HasDefaultValue(false);
_ = quoteEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); quoteEntity.Property(e => e.QuoteContainsRb).HasDefaultValue(false);
_ = quoteEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); quoteEntity.Property(e => e.QuoteTemplate).HasDefaultValue("");
_ = quoteEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); quoteEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); quoteEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); quoteEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); quoteEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = quoteEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); quoteEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
quoteEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
quoteEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
quoteEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -115,34 +121,34 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<LineItem> entity) public void Configure(EntityTypeBuilder<LineItem> entity)
{ {
_ = entity.HasKey(e => e.LineItemId); entity.HasKey(e => e.LineItemId);
_ = entity.HasOne(p => p.Quote).WithMany(d => d.LineItems).HasForeignKey(fk => fk.QuoteId).IsRequired().OnDelete(DeleteBehavior.Cascade); entity.HasOne(p => p.Quote).WithMany(d => d.LineItems).HasForeignKey(fk => fk.QuoteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
_ = entity.Property(e => e.Position).IsRequired(); entity.Property(e => e.Position).IsRequired();
_ = entity.Property(e => e.Amount).IsRequired(); entity.Property(e => e.Amount).IsRequired();
_ = entity.Property(e => e.ProductNumber).IsRequired(); entity.Property(e => e.ProductNumber).IsRequired();
_ = entity.Property(e => e.OptionNumber).HasDefaultValue(""); entity.Property(e => e.OptionNumber).HasDefaultValue("");
_ = entity.Property(e => e.SapShortDescription).HasDefaultValue(""); entity.Property(e => e.SapShortDescription).HasDefaultValue("");
_ = entity.Property(e => e.SapLongDescription).HasDefaultValue(""); entity.Property(e => e.SapLongDescription).HasDefaultValue("");
_ = entity.Property(e => e.ProductLine).HasDefaultValue(""); entity.Property(e => e.ProductLine).HasDefaultValue("");
_ = entity.Property(e => e.TotalDiscount).IsRequired().HasDefaultValue(0); entity.Property(e => e.TotalDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.SalesDiscount).IsRequired().HasDefaultValue(0); entity.Property(e => e.SalesDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.PromotionalDiscount).IsRequired().HasDefaultValue(0); entity.Property(e => e.PromotionalDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.ContractualDiscount).IsRequired().HasDefaultValue(0); entity.Property(e => e.ContractualDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.DemoDiscount).IsRequired().HasDefaultValue(0); entity.Property(e => e.DemoDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.ListPrice).IsRequired(); entity.Property(e => e.ListPrice).IsRequired();
_ = entity.Property(e => e.ExtendedListPrice).IsRequired(); entity.Property(e => e.ExtendedListPrice).IsRequired();
_ = entity.Property(e => e.NetPrice).IsRequired(); entity.Property(e => e.NetPrice).IsRequired();
_ = entity.Property(e => e.Total).IsRequired(); entity.Property(e => e.Total).IsRequired();
_ = entity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); entity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = entity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); entity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = entity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); entity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = entity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); entity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = entity.Property(e => e.DataVersionComment).HasDefaultValue(""); entity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = entity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); entity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
_ = entity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); entity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = entity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); entity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -150,29 +156,29 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<Product> productEntity) public void Configure(EntityTypeBuilder<Product> productEntity)
{ {
_ = productEntity.HasKey(e => e.ProductId); productEntity.HasKey(e => e.ProductId);
_ = productEntity.HasOne(d => d.CustomDescription).WithMany(p => p.Products).HasForeignKey("CustomDescriptionId").IsRequired().OnDelete(DeleteBehavior.SetNull); productEntity.HasOne(d => d.CustomDescription).WithMany(p => p.Products).HasForeignKey("CustomDescriptionId").IsRequired().OnDelete(DeleteBehavior.SetNull);
_ = productEntity.HasOne(p => p.ProductLine).WithMany(d => d.Products).HasForeignKey("ProductLineCode").IsRequired().OnDelete(DeleteBehavior.Restrict); productEntity.HasOne(p => p.ProductLine).WithMany(d => d.Products).HasForeignKey("ProductLineCode").IsRequired().OnDelete(DeleteBehavior.Restrict);
_ = productEntity.Property(e => e.CustomDescriptionId).IsRequired(); productEntity.Property(e => e.CustomDescriptionId).IsRequired();
_ = productEntity.Property(e => e.ProductNumber).IsRequired(); productEntity.Property(e => e.ProductNumber).IsRequired();
_ = productEntity.Property(e => e.OptionNumber).HasDefaultValue(""); productEntity.Property(e => e.OptionNumber).HasDefaultValue("");
_ = productEntity.Property(e => e.SapShortDescription).HasDefaultValue(""); productEntity.Property(e => e.SapShortDescription).HasDefaultValue("");
_ = productEntity.Property(e => e.SapLongDescription).HasDefaultValue(""); productEntity.Property(e => e.SapLongDescription).HasDefaultValue("");
_ = productEntity.Property(e => e.Weight).HasDefaultValue(0); productEntity.Property(e => e.Weight).HasDefaultValue(0);
_ = productEntity.Property(e => e.ProductStatus).HasDefaultValue("Active"); productEntity.Property(e => e.ProductStatus).HasDefaultValue("Active");
_ = productEntity.Property(e => e.IntroductionDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); productEntity.Property(e => e.IntroductionDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = productEntity.Property(e => e.ListPrice).IsRequired(); productEntity.Property(e => e.ListPrice).IsRequired();
_ = productEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); productEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = productEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); productEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = productEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); productEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = productEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); productEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = productEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); productEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = productEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); productEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
_ = productEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); productEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = productEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); productEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -180,25 +186,25 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<CustomDescription> customDescriptionEntity) public void Configure(EntityTypeBuilder<CustomDescription> customDescriptionEntity)
{ {
_ = customDescriptionEntity.HasKey(e => e.CustomDescriptionId); customDescriptionEntity.HasKey(e => e.CustomDescriptionId);
_ = customDescriptionEntity.HasMany(p => p.Products).WithOne(d => d.CustomDescription).IsRequired(false); customDescriptionEntity.HasMany(p => p.Products).WithOne(d => d.CustomDescription).IsRequired(false);
_ = customDescriptionEntity.HasOne(p => p.Supplier).WithMany(d => d.CustomDescriptions).IsRequired(); customDescriptionEntity.HasOne(p => p.Supplier).WithMany(d => d.CustomDescriptions).IsRequired();
_ = customDescriptionEntity.Property(e => e.ProductNumber).IsRequired(); customDescriptionEntity.Property(e => e.ProductNumber).IsRequired();
_ = customDescriptionEntity.Property(e => e.OptionNumber).HasDefaultValue(""); customDescriptionEntity.Property(e => e.OptionNumber).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.Heading).IsRequired(); customDescriptionEntity.Property(e => e.Heading).IsRequired();
_ = customDescriptionEntity.Property(e => e.DescriptionText).HasDefaultValue(""); customDescriptionEntity.Property(e => e.DescriptionText).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.CoverletterText).HasDefaultValue(""); customDescriptionEntity.Property(e => e.CoverletterText).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.Notes).HasDefaultValue(""); customDescriptionEntity.Property(e => e.Notes).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); customDescriptionEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = customDescriptionEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); customDescriptionEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = customDescriptionEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); customDescriptionEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = customDescriptionEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); customDescriptionEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = customDescriptionEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); customDescriptionEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); customDescriptionEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
_ = customDescriptionEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); customDescriptionEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = customDescriptionEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); customDescriptionEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -206,18 +212,18 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<ProductLine> productLineEntity) public void Configure(EntityTypeBuilder<ProductLine> productLineEntity)
{ {
_ = productLineEntity.HasMany(p => p.Products).WithOne(d => d.ProductLine).IsRequired().OnDelete(DeleteBehavior.Restrict); productLineEntity.HasMany(p => p.Products).WithOne(d => d.ProductLine).IsRequired().OnDelete(DeleteBehavior.Restrict);
_ = productLineEntity.Property(e => e.ProductLineDescription).IsRequired(); productLineEntity.Property(e => e.ProductLineDescription).IsRequired();
_ = productLineEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); productLineEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = productLineEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); productLineEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = productLineEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); productLineEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = productLineEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); productLineEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = productLineEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); productLineEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = productLineEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); productLineEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
_ = productLineEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); productLineEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = productLineEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); productLineEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -227,17 +233,17 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
//entity.HasKey(e => e.AccountTypeCode); //entity.HasKey(e => e.AccountTypeCode);
//entity.HasMany(p => p.Accounts).WithOne(d => d.AccountType); //already defined in class Account //entity.HasMany(p => p.Accounts).WithOne(d => d.AccountType); //already defined in class Account
_ = accountTypeEntity.Property(e => e.AccountTypeCode).IsRequired().HasColumnType("Char(3)"); accountTypeEntity.Property(e => e.AccountTypeCode).IsRequired().HasColumnType("Char(3)");
_ = accountTypeEntity.Property(e => e.AccountTypeDescription).HasColumnType("Varchar(1000)").IsRequired(); accountTypeEntity.Property(e => e.AccountTypeDescription).HasColumnType("Varchar(1000)").IsRequired();
_ = accountTypeEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); accountTypeEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = accountTypeEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); accountTypeEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = accountTypeEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); accountTypeEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = accountTypeEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); accountTypeEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = accountTypeEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); accountTypeEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = accountTypeEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); accountTypeEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
_ = accountTypeEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); accountTypeEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = accountTypeEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); accountTypeEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -247,17 +253,17 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
//entity.HasKey(e => e.SubMarketCode); //entity.HasKey(e => e.SubMarketCode);
//entity.HasMany(p => p.Accounts).WithOne(d => d.SubMarket); //already defined in class Account //entity.HasMany(p => p.Accounts).WithOne(d => d.SubMarket); //already defined in class Account
_ = subMarketEntity.Property(e => e.SubMarketCode).HasColumnType("Char(3)"); subMarketEntity.Property(e => e.SubMarketCode).HasColumnType("Char(3)");
_ = subMarketEntity.Property(e => e.SubMarketDescription).HasColumnType("Varchar(1000)").IsRequired(); subMarketEntity.Property(e => e.SubMarketDescription).HasColumnType("Varchar(1000)").IsRequired();
_ = subMarketEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); subMarketEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = subMarketEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); subMarketEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = subMarketEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd(); subMarketEntity.Property(e => e.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = subMarketEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); subMarketEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = subMarketEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); subMarketEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = subMarketEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active"); subMarketEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
_ = subMarketEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); subMarketEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = subMarketEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); subMarketEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -265,15 +271,15 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<RegisteredUser> registeredUserEntity) public void Configure(EntityTypeBuilder<RegisteredUser> registeredUserEntity)
{ {
_ = registeredUserEntity.HasKey(e => e.RegisteredUserId); registeredUserEntity.HasKey(e => e.RegisteredUserId);
_ = registeredUserEntity.HasMany(d => d.RuSettings).WithOne(p => p.RegisteredUser).IsRequired(); registeredUserEntity.HasMany(d => d.RuSettings).WithOne(p => p.RegisteredUser).IsRequired();
_ = registeredUserEntity.Property(e => e.UserName).IsRequired(); registeredUserEntity.Property(e => e.UserName).IsRequired();
_ = registeredUserEntity.Property(e => e.PasswordHash).IsRequired(); registeredUserEntity.Property(e => e.PasswordHash).IsRequired();
_ = registeredUserEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); registeredUserEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = registeredUserEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); registeredUserEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = registeredUserEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); registeredUserEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
@ -281,15 +287,15 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{ {
public void Configure(EntityTypeBuilder<RuSettings> rUSettingsEntitity) public void Configure(EntityTypeBuilder<RuSettings> rUSettingsEntitity)
{ {
_ = rUSettingsEntitity.HasKey(e => e.RuSettingsId); rUSettingsEntitity.HasKey(e => e.RuSettingsId);
_ = rUSettingsEntitity.HasOne(d => d.RegisteredUser).WithMany(p => p.RuSettings).IsRequired(); rUSettingsEntitity.HasOne(d => d.RegisteredUser).WithMany(p => p.RuSettings).IsRequired();
_ = rUSettingsEntitity.Property(e => e.SettingKey).IsRequired(); rUSettingsEntitity.Property(e => e.SettingKey).IsRequired();
_ = rUSettingsEntitity.Property(e => e.SettingValue).IsRequired(); rUSettingsEntitity.Property(e => e.SettingValue).IsRequired();
_ = rUSettingsEntitity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd(); rUSettingsEntitity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = rUSettingsEntitity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(); rUSettingsEntitity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken();
_ = rUSettingsEntitity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); rUSettingsEntitity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
} }
} }
} }

@ -65,7 +65,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses
modelBuilder.Entity<Account>().Navigation(db => db.SubMarket).AutoInclude(); modelBuilder.Entity<Account>().Navigation(db => db.SubMarket).AutoInclude();
modelBuilder.Entity<Account>().Navigation(db => db.CustomDescriptions).AutoInclude(); modelBuilder.Entity<Account>().Navigation(db => db.CustomDescriptions).AutoInclude();
modelBuilder.Entity<Contact>().Navigation(db => db.Account).AutoInclude(); //modelBuilder.Entity<Contact>().Navigation(db => db.Account).AutoInclude();
//modelBuilder.Entity<Contact>().Navigation(db => db.Quotes).AutoInclude(); //modelBuilder.Entity<Contact>().Navigation(db => db.Quotes).AutoInclude();

@ -10,16 +10,16 @@
public uint AccountId { get; set; } public uint AccountId { get; set; }
//navigation properties: //navigation properties:
public IList<Product> Products { get; set; } public IList<Product>? Products { get; set; }
public Account Supplier { get; set; } public Account? Supplier { get; set; }
//class properties: //class properties:
public string ProductNumber { get; set; } public string? ProductNumber { get; set; }
public string OptionNumber { get; set; } public string? OptionNumber { get; set; }
public string Heading { get; set; } public string? Heading { get; set; }
public string DescriptionText { get; set; } public string? DescriptionText { get; set; }
public string CoverletterText { get; set; } public string? CoverletterText { get; set; }
public string Notes { get; set; } //Hinweise, Tipps, Caveats, etc. für Konfiguration, Verwendung, Best Practice usw. public string? Notes { get; set; } //Hinweise, Tipps, Caveats, etc. für Konfiguration, Verwendung, Best Practice usw.
//Agilent-Specific properties: //Agilent-Specific properties:
//NONE //NONE
@ -29,9 +29,9 @@
public DateTime DataModificationDate { get; set; } = DateTime.Now; public DateTime DataModificationDate { get; set; } = DateTime.Now;
public DateTime DataValidFrom { get; set; } = DateTime.Now; public DateTime DataValidFrom { get; set; } = DateTime.Now;
public DateTime DataValidUntil { get; set; } = DateTime.MaxValue; public DateTime DataValidUntil { get; set; } = DateTime.MaxValue;
public string DataModificationByUser { get; set; } public string? DataModificationByUser { get; set; }
public uint DataVersionNumber { get; set; } public uint DataVersionNumber { get; set; }
public string DataVersionComment { get; set; } public string? DataVersionComment { get; set; }
public string DataStatus { get; set; } public string DataStatus { get; set; } = "Active";
} }
} }

@ -3,12 +3,12 @@
public interface IMetadata public interface IMetadata
{ {
DateTime DataCreationDate { get; set; } DateTime DataCreationDate { get; set; }
string DataModificationByUser { get; set; } string? DataModificationByUser { get; set; }
DateTime DataModificationDate { get; set; } DateTime DataModificationDate { get; set; }
string DataStatus { get; set; } string DataStatus { get; set; }
DateTime DataValidFrom { get; set; } DateTime DataValidFrom { get; set; }
DateTime DataValidUntil { get; set; } DateTime DataValidUntil { get; set; }
string DataVersionComment { get; set; } string? DataVersionComment { get; set; }
uint DataVersionNumber { get; set; } uint DataVersionNumber { get; set; }
} }
} }

@ -49,9 +49,11 @@
</DataGrid> </DataGrid>
} }
@code { @code {
private IList<Contact> contacts; private IList<Contact>? contacts;
private Contact selectedContact; private Contact? selectedContact;
private Quote selectedQuote; private Quote? selectedQuote;
private IList<Quote>? quotesOfSelectedContact;
private IList<LineItem>? lineItemsInSelectedQuote;
private readonly CultureInfo cultureInfo = new("de-DE"); private readonly CultureInfo cultureInfo = new("de-DE");
protected override Task OnInitializedAsync() protected override Task OnInitializedAsync()
@ -62,12 +64,16 @@
private Task OnSelectedContactChanged(Contact sC) private Task OnSelectedContactChanged(Contact sC)
{ {
selectedContact = null;
quotesOfSelectedContact = genericController.GetAll<Quote>(q => q.Recipient == sC);
selectedContact = sC; selectedContact = sC;
return Task.CompletedTask; return Task.CompletedTask;
} }
private Task OnSelectedQuoteChanged(Quote sQ) private Task OnSelectedQuoteChanged(Quote sQ)
{ {
selectedQuote = null;
lineItemsInSelectedQuote = genericController.GetAll<LineItem>(l => l.Quote == sQ);
selectedQuote = sQ; selectedQuote = sQ;
return Task.CompletedTask; return Task.CompletedTask;
} }

@ -5,12 +5,13 @@
@using System.Globalization; @using System.Globalization;
@using System.Diagnostics @using System.Diagnostics
@inject GenericController genericController
@inject GenericTypeController<Quote> QuoteService @inject GenericTypeController<Quote> QuoteService
@inject GenericTypeController<Contact> ContactService @inject GenericTypeController<Contact> ContactService
@inject GenericTypeController<Account> AccountService @inject GenericTypeController<Account> AccountService
@inject GenericTypeController<CustomDescription> CustomDescriptionService @inject GenericTypeController<CustomDescription> CustomDescriptionService
@inject QuoteHandling QuoteHandling @inject QuoteHandling QuoteHandling
@inject NavigationManager NavigationManager @inject NavigationManager navigationManager
<h1>Create New Quote</h1> <h1>Create New Quote</h1>
@ -27,80 +28,83 @@
<DataGridColumn Field="@nameof(Contact.SapContactNumber)" Caption="SAPContactNumber" Sortable Filterable /> <DataGridColumn Field="@nameof(Contact.SapContactNumber)" Caption="SAPContactNumber" Sortable Filterable />
</DataGrid> </DataGrid>
<h2>Quote Details</h2> @if (quote != null)
<Row>
<Column ColumnSize="ColumnSize.Is7">
<Fields>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.Description" TextChanged="@OnDescriptionChanged" /></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.QuotationNumber" TextChanged="@OnQuotationNumberChanged" /></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@quote.Path</FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@quote.Warranty</FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.ValidFor.ToString()" TextChanged="@OnValidForChanged" /></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.Vat.ToString(CultureInfo.CurrentCulture)" TextChanged="@OnVATChanged" /></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.Freight.ToString(CultureInfo.CurrentCulture)" /></FieldBody></Field>
</Fields>
</Column>
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" Checked="@quote.IsPriceInformation" CheckedChanged="@OnIsPriceInformationChanged">Preisinformation</Check>
<Check TValue="bool" Checked="@quote.ShowBrutto" CheckedChanged="@OnShowBruttoChanged">Bruttopreise anzeigen</Check>
<Check TValue="bool" Checked="@quote.ShowSinglePrices" CheckedChanged="@OnShowSinglePricesChanged">Einzelpreise ausweisen</Check>
<Check TValue="bool" Checked="@quote.ShowDiscounts" CheckedChanged="@OnShowDiscountsChanged">Discounts ausweisen</Check>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis netto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Summe netto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalNet.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme netto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalVat.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme brutto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalGross.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
</Column>
</Row>
@if (quote.LineItems.Count != 0)
{ {
<h2>LineItems</h2> <h2>Quote Details</h2>
<DataGrid TItem="LineItem" Data="@quote.LineItems" SelectedRow="@selectedLineItem" SelectedRowChanged="@OnSelectedLineItemChanged" Bordered Hoverable Striped ShowPager Responsive> <Row>
<DataGridCommandColumn /> <Column ColumnSize="ColumnSize.Is7">
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" /> <Fields>
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber" /> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.Description" TextChanged="@OnDescriptionChanged" /></FieldBody></Field>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber" /> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.QuotationNumber" TextChanged="@OnQuotationNumberChanged" /></FieldBody></Field>
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" /> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@quote.Path</FieldBody></Field>
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount" /> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@quote.Warranty</FieldBody></Field>
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total" /> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.ValidFor.ToString()" TextChanged="@OnValidForChanged" /></FieldBody></Field>
</DataGrid> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.Vat.ToString(CultureInfo.CurrentCulture)" TextChanged="@OnVATChanged" /></FieldBody></Field>
@if (selectedLineItem.ProductNumber != "") <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@quote.Freight.ToString(CultureInfo.CurrentCulture)" /></FieldBody></Field>
{ </Fields>
<h2>CustomDescription</h2> </Column>
<Column ColumnSize="ColumnSize.Is12">
<Fields> <Column ColumnSize="ColumnSize.Is2">
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">ProductNumber</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.ProductNumber"/></FieldBody></Field> <Check TValue="bool" Checked="@quote.IsPriceInformation" CheckedChanged="@OnIsPriceInformationChanged">Preisinformation</Check>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">OptionNumber</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.OptionNumber"/></FieldBody></Field> <Check TValue="bool" Checked="@quote.ShowBrutto" CheckedChanged="@OnShowBruttoChanged">Bruttopreise anzeigen</Check>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Heading</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.Heading"/></FieldBody></Field> <Check TValue="bool" Checked="@quote.ShowSinglePrices" CheckedChanged="@OnShowSinglePricesChanged">Einzelpreise ausweisen</Check>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">DescriptionText</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.DescriptionText"/></FieldBody></Field> <Check TValue="bool" Checked="@quote.ShowDiscounts" CheckedChanged="@OnShowDiscountsChanged">Discounts ausweisen</Check>
</Fields> </Column>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis netto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Summe netto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalNet.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme netto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalVat.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme brutto:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@quote.TotalGross.ToString("C", CultureInfo.CurrentCulture)"></TextEdit></FieldBody></Field>
</Column>
</Row>
@if (quote.LineItems != null)
{
<h2>LineItems</h2>
<DataGrid TItem="LineItem" Data="@quote.LineItems" SelectedRow="@selectedLineItem" SelectedRowChanged="@OnSelectedLineItemChanged" Bordered Hoverable Striped ShowPager Responsive>
<DataGridCommandColumn />
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber" />
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber" />
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount" />
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total" />
</DataGrid>
@if (selectedLineItem != null)
{
<h2>CustomDescription</h2>
<Column ColumnSize="ColumnSize.Is12">
<Fields>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">ProductNumber</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.ProductNumber"/></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">OptionNumber</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.OptionNumber"/></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Heading</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.Heading"/></FieldBody></Field>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">DescriptionText</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.DescriptionText"/></FieldBody></Field>
</Fields>
</Column>
}
} }
}
@if (quote.LineItems.Count == 0)
{
<h2>Uploading Quote</h2>
<Field><FieldLabel>Please select PriceSurfer quote as TSV</FieldLabel><FileEdit Filter=".tsv" Changed="@SelectQuoteOnChanged" Written="@SelectQuoteOnWritten" Progressed="@SelectQuoteOnProgressed" /></Field>
}
<h2>Create Quote</h2> @if (quote.LineItems == null)
<Button Color="Color.Primary" Clicked="@OnCreateTex">Create Tex from Quote</Button> {
<Button Color="Color.Secondary" Clicked="@OnCreatePdf">Create PDF from Tex</Button> <h2>Uploading Quote</h2>
<Button Color="Color.Secondary" Clicked="@OnOpenPdf">Open PDF</Button> <Field><FieldLabel>Please select PriceSurfer quote as TSV</FieldLabel><FileEdit Filter=".tsv" Changed="@SelectQuoteOnChanged" Written="@SelectQuoteOnWritten" Progressed="@SelectQuoteOnProgressed" /></Field>
<Button Color="Color.Success" Clicked="@OnSave">Save</Button> }
<Button Color="Color.Danger" Clicked="@OnCancel">Cancel</Button>
<h2>Create Quote</h2>
<Button Color="Color.Primary" Clicked="@OnCreateTex">Create Tex from Quote</Button>
<Button Color="Color.Secondary" Clicked="@OnCreatePdf">Create PDF from Tex</Button>
<Button Color="Color.Secondary" Clicked="@OnOpenPdf">Open PDF</Button>
<Button Color="Color.Success" Clicked="@OnSave">Save</Button>
<Button Color="Color.Danger" Clicked="@OnCancel">Cancel</Button>
}
@code { @code {
private IList<Contact> contacts; private IList<Contact> contacts;
private Quote quote; private Quote quote = new();
private Contact selectedContact; private Contact selectedContact;
private LineItem selectedLineItem; private LineItem selectedLineItem;
private CustomDescription customDescriptionOfSelectedLineItem; private CustomDescription customDescriptionOfSelectedLineItem;
@ -108,21 +112,13 @@
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
contacts = await ContactService.GetAllAsync(); contacts = genericController.GetAll<Contact>("Account");
selectedContact = contacts.First(); await GenerateNewQuote("Woitschetzki");
}
//Resolve account if not present
if (selectedContact.Account.AccountId == 0)
{
selectedContact.Account = await AccountService.GetAccountAsync(selectedContact);
await ContactService.UpdateAsync(selectedContact);
}
await OnSelectedContactChanged(selectedContact);
quote.Recipient = selectedContact; private async Task GenerateNewQuote(string salesRep)
quote.SalesRep = await ContactService.GetContactAsync("Woitschetzki"); {
quote.SalesRep = genericController.Get<Contact>(c => c.LastName == salesRep);
quote.QuoteId = await QuoteService.GetLastId() + 1; quote.QuoteId = await QuoteService.GetLastId() + 1;
quote.QuotationNumber = quote.SalesRep.LastName switch quote.QuotationNumber = quote.SalesRep.LastName switch
{ {
@ -167,21 +163,21 @@
private async Task OnSelectedContactChanged(Contact sC) private async Task OnSelectedContactChanged(Contact sC)
{ {
selectedContact = sC; selectedContact = sC;
selectedContact.Account = await AccountService.GetAccountAsync(selectedContact);
quote.Recipient = selectedContact; quote.Recipient = selectedContact;
} }
private async void OnSave() private async void OnSave()
{ {
quote.DataModificationByUser = "Gremlin_BlazorServer"; quote.DataModificationByUser = "Gremlin_BlazorServer";
if (await QuoteService.InsertAsync(quote)) NavigationManager.NavigateTo("Quotes/QuoteIndex"); if (await QuoteService.InsertAsync(quote)) navigationManager.NavigateTo("Quotes/QuoteIndex");
} }
private async void OnCreateTex() private Task OnCreateTex()
{ {
StringBuilder texStringBuilder = await QuoteHandling.CreateTex(quote); StringBuilder texStringBuilder = QuoteHandling.CreateTex(quote);
quote.Tex = texStringBuilder.ToString(); quote.Tex = texStringBuilder.ToString();
FileService.WriteTexFile(quote); FileService.WriteTexFile(quote);
return Task.CompletedTask;
} }
private void OnCreatePdf() => PdfService.CreatePdf(quote); private void OnCreatePdf() => PdfService.CreatePdf(quote);
@ -236,16 +232,11 @@
return Task.CompletedTask; return Task.CompletedTask;
} }
private async Task OnCancel() private async Task OnCancel() => navigationManager.NavigateTo("Quotes/QuoteIndex");
{
await QuoteService.DeleteAsync(quote);
NavigationManager.NavigateTo("Quotes/QuoteIndex");
}
private async Task OnSelectedLineItemChanged(LineItem lineItem) private async Task OnSelectedLineItemChanged(LineItem lI)
{ {
selectedLineItem = lineItem; selectedLineItem = lI;
customDescriptionOfSelectedLineItem = await CustomDescriptionService.GetCustomDescriptionAsync(lineItem); customDescriptionOfSelectedLineItem = genericController.Get<CustomDescription>(cD => cD.ProductNumber == lI.ProductNumber && cD.OptionNumber == lI.OptionNumber);
} }
} }

@ -5,14 +5,14 @@
@using System.Globalization; @using System.Globalization;
@inject GenericController genericController @inject GenericController genericController
@inject NavigationManager navigationManager
<AuthorizeView> <h1>Quotes</h1>
<Authorized>
<h1>Quotes</h1> <Button Color="Color.Primary" Clicked="@OnCreateNewQuote">Create New Quote</Button>
<NavLink class="nav-link" href="Quotes/QuoteAdd">
<span class="oi oi-plus" aria-hidden="true">Create New Quote</span>
</NavLink>
<AuthorizeView>
<Authorized>
@if (quotes != null) @if (quotes != null)
{ {
<DataGrid TItem="Quote" Data="@quotes" SelectedRow="@selectedQuote" SelectedRowChanged="@OnSelectedQuoteChanged" ShowPager Bordered Hoverable Sortable Filterable Striped Responsive> <DataGrid TItem="Quote" Data="@quotes" SelectedRow="@selectedQuote" SelectedRowChanged="@OnSelectedQuoteChanged" ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
@ -50,9 +50,9 @@
<Column ColumnSize="ColumnSize.Is3"> <Column ColumnSize="ColumnSize.Is3">
<Fields> <Fields>
<Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Empfänger Nachname:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@recipient.LastName"/></FieldBody></Field> <Field Horizontal><FieldLabel ColumnSize="ColumnSize.Is4">Empfänger Nachname:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6"><TextEdit Text="@selectedQuote.Recipient.LastName"/></FieldBody></Field>
</Fields> </Fields>
</Column> </Column>lineItemsInSelectedQuote
<Column ColumnSize="ColumnSize.Is2"> <Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" ReadOnly Checked="@selectedQuote.IsPriceInformation">Preisinformation</Check> <Check TValue="bool" ReadOnly Checked="@selectedQuote.IsPriceInformation">Preisinformation</Check>
@ -102,22 +102,26 @@
</AuthorizeView> </AuthorizeView>
@code { @code {
private Task<AuthenticationState>? authenticationStateTask { get; set; }
private IList<Quote>? quotes; private IList<Quote>? quotes;
private Quote? selectedQuote; private Quote? selectedQuote;
private Contact? recipient; //private Contact? recipient;
private IList<LineItem>? lineItemsInSelectedQuote; private IList<LineItem>? lineItemsInSelectedQuote;
private readonly CultureInfo cultureInfo = new("de-DE"); private readonly CultureInfo cultureInfo = new("de-DE");
protected override async Task OnInitializedAsync() protected override Task OnInitializedAsync()
{ {
quotes = genericController.GetAll<Quote>(); quotes = genericController.GetAll<Quote>("Recipient");
return Task.CompletedTask;
} }
private async Task OnSelectedQuoteChanged(Quote sQ) private void OnSelectedQuoteChanged(Quote sQ)
{ {
selectedQuote = null; selectedQuote = null;
recipient = genericController.Get<Contact>(contact => contact == sQ.Recipient); //recipient = genericController.Get<Contact>(contact => contact == sQ.Recipient, "Account");
lineItemsInSelectedQuote = genericController.GetAll<LineItem>(lineItem => lineItem.Quote == sQ); lineItemsInSelectedQuote = genericController.GetAll<LineItem>(lineItem => lineItem.Quote == sQ);
selectedQuote = sQ; selectedQuote = sQ;
} }
private void OnCreateNewQuote() => navigationManager.NavigateTo("Quotes/QuoteAdd");
} }

@ -0,0 +1,17 @@
# Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
1 G7104C 29 1260 Infinity II Flexible Pumpe 1 33344 0 0 40 20006.4 20006.4 40 0 0 0 ISL100P1 Pumps
2 G7104C 001 29 HPLC System Tool-Kit 1260 Infinity II 1 377 0 0 40 226.2 226.2 40 0 0 0
3 G7104C 004 29 Agilent Lab Advisor Advanced Software 1 1574 0 0 40 944.4 944.4 40 0 0 0
4 G7104C 034 29 InfinityLab Stay Safe Verschl., St.-Kit 1 664 0 0 40 398.4 398.4 40 0 0 0
5 G7104C 097 29 Poroshell 120 EC-C18 3,0x150mm, 2,7um 1 1 0 0 40 0.6 0.6 40 0 0 0
6 G7167A 29 1260 Infinity II Mehrfachprobengeber 1 27195 0 0 40 16317 16317 40 0 0 0 ISL100A1 Autosamplers
7 G7167A 060 29 Nutzung vorhandene Lizenz 1 -1733 0 0 40 -1039.8 -1039.8 40 0 0 0
8 G7167A 101 29 Agilent InfinityLab Proben-Thermostat 1 5871 0 0 40 3522.6 3522.6 40 0 0 0
9 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6275 0 0 40 3765 3765 40 0 0 0 ISL100LC1 LC Hardware
10 G7162A 29 1260 Infinity II Brechungsindexdetektor 1 13516 0 0 40 8109.6 8109.6 40 0 0 0 ISL100D1 Detectors
11 M8414AA LI OpenLab CDS Workstation PC-Paket 1 16854 0 0 40 10112.4 10112.4 40 0 0 0 ISF300F110 OpenLAB CDS w/Hardware
12 M8414AA 001 LI LC Geraeteverbindung 1 0 0 0 40 0 0 40 0 0 0
13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 999 0 0 20 799.2 799.2 20 0 0 0 TSSTRN Training Services
15 SYS-LC-1260II 8R2 74 CrossLab Silver - 2J, kompl. 1 10403 0 0 35 6761.95 6761.95 30 0 5 0 TSSYS2 Serviced As Systems - 2 YR > 29
1 # Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
2 1 G7104C 29 1260 Infinity II Flexible Pumpe 1 33344 0 0 40 20006.4 20006.4 40 0 0 0 ISL100P1 Pumps
3 2 G7104C 001 29 HPLC System Tool-Kit 1260 Infinity II 1 377 0 0 40 226.2 226.2 40 0 0 0
4 3 G7104C 004 29 Agilent Lab Advisor Advanced Software 1 1574 0 0 40 944.4 944.4 40 0 0 0
5 4 G7104C 034 29 InfinityLab Stay Safe Verschl., St.-Kit 1 664 0 0 40 398.4 398.4 40 0 0 0
6 5 G7104C 097 29 Poroshell 120 EC-C18 3,0x150mm, 2,7um 1 1 0 0 40 0.6 0.6 40 0 0 0
7 6 G7167A 29 1260 Infinity II Mehrfachprobengeber 1 27195 0 0 40 16317 16317 40 0 0 0 ISL100A1 Autosamplers
8 7 G7167A 060 29 Nutzung vorhandene Lizenz 1 -1733 0 0 40 -1039.8 -1039.8 40 0 0 0
9 8 G7167A 101 29 Agilent InfinityLab Proben-Thermostat 1 5871 0 0 40 3522.6 3522.6 40 0 0 0
10 9 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6275 0 0 40 3765 3765 40 0 0 0 ISL100LC1 LC Hardware
11 10 G7162A 29 1260 Infinity II Brechungsindexdetektor 1 13516 0 0 40 8109.6 8109.6 40 0 0 0 ISL100D1 Detectors
12 11 M8414AA LI OpenLab CDS Workstation PC-Paket 1 16854 0 0 40 10112.4 10112.4 40 0 0 0 ISF300F110 OpenLAB CDS w/Hardware
13 12 M8414AA 001 LI LC Geraeteverbindung 1 0 0 0 40 0 0 40 0 0 0
14 13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
15 14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 999 0 0 20 799.2 799.2 20 0 0 0 TSSTRN Training Services
16 15 SYS-LC-1260II 8R2 74 CrossLab Silver - 2J, kompl. 1 10403 0 0 35 6761.95 6761.95 30 0 5 0 TSSYS2 Serviced As Systems - 2 YR > 29

@ -0,0 +1,17 @@
# Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
1 G7104C 29 1260 Infinity II Flexible Pumpe 1 33344 0 0 40 20006.4 20006.4 40 0 0 0 ISL100P1 Pumps
2 G7104C 001 29 HPLC System Tool-Kit 1260 Infinity II 1 377 0 0 40 226.2 226.2 40 0 0 0
3 G7104C 004 29 Agilent Lab Advisor Advanced Software 1 1574 0 0 40 944.4 944.4 40 0 0 0
4 G7104C 034 29 InfinityLab Stay Safe Verschl., St.-Kit 1 664 0 0 40 398.4 398.4 40 0 0 0
5 G7104C 097 29 Poroshell 120 EC-C18 3,0x150mm, 2,7um 1 1 0 0 40 0.6 0.6 40 0 0 0
6 G7167A 29 1260 Infinity II Mehrfachprobengeber 1 27195 0 0 40 16317 16317 40 0 0 0 ISL100A1 Autosamplers
7 G7167A 060 29 Nutzung vorhandene Lizenz 1 -1733 0 0 40 -1039.8 -1039.8 40 0 0 0
8 G7167A 101 29 Agilent InfinityLab Proben-Thermostat 1 5871 0 0 40 3522.6 3522.6 40 0 0 0
9 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6275 0 0 40 3765 3765 40 0 0 0 ISL100LC1 LC Hardware
10 G7162A 29 1260 Infinity II Brechungsindexdetektor 1 13516 0 0 40 8109.6 8109.6 40 0 0 0 ISL100D1 Detectors
11 M8414AA LI OpenLab CDS Workstation PC-Paket 1 16854 0 0 40 10112.4 10112.4 40 0 0 0 ISF300F110 OpenLAB CDS w/Hardware
12 M8414AA 001 LI LC Geraeteverbindung 1 0 0 0 40 0 0 40 0 0 0
13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 999 0 0 20 799.2 799.2 20 0 0 0 TSSTRN Training Services
15 SYS-LC-1260II 8R2 74 CrossLab Silver - 2J, kompl. 1 10403 0 0 35 6761.95 6761.95 30 0 5 0 TSSYS2 Serviced As Systems - 2 YR > 29
1 # Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
2 1 G7104C 29 1260 Infinity II Flexible Pumpe 1 33344 0 0 40 20006.4 20006.4 40 0 0 0 ISL100P1 Pumps
3 2 G7104C 001 29 HPLC System Tool-Kit 1260 Infinity II 1 377 0 0 40 226.2 226.2 40 0 0 0
4 3 G7104C 004 29 Agilent Lab Advisor Advanced Software 1 1574 0 0 40 944.4 944.4 40 0 0 0
5 4 G7104C 034 29 InfinityLab Stay Safe Verschl., St.-Kit 1 664 0 0 40 398.4 398.4 40 0 0 0
6 5 G7104C 097 29 Poroshell 120 EC-C18 3,0x150mm, 2,7um 1 1 0 0 40 0.6 0.6 40 0 0 0
7 6 G7167A 29 1260 Infinity II Mehrfachprobengeber 1 27195 0 0 40 16317 16317 40 0 0 0 ISL100A1 Autosamplers
8 7 G7167A 060 29 Nutzung vorhandene Lizenz 1 -1733 0 0 40 -1039.8 -1039.8 40 0 0 0
9 8 G7167A 101 29 Agilent InfinityLab Proben-Thermostat 1 5871 0 0 40 3522.6 3522.6 40 0 0 0
10 9 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6275 0 0 40 3765 3765 40 0 0 0 ISL100LC1 LC Hardware
11 10 G7162A 29 1260 Infinity II Brechungsindexdetektor 1 13516 0 0 40 8109.6 8109.6 40 0 0 0 ISL100D1 Detectors
12 11 M8414AA LI OpenLab CDS Workstation PC-Paket 1 16854 0 0 40 10112.4 10112.4 40 0 0 0 ISF300F110 OpenLAB CDS w/Hardware
13 12 M8414AA 001 LI LC Geraeteverbindung 1 0 0 0 40 0 0 40 0 0 0
14 13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
15 14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 999 0 0 20 799.2 799.2 20 0 0 0 TSSTRN Training Services
16 15 SYS-LC-1260II 8R2 74 CrossLab Silver - 2J, kompl. 1 10403 0 0 35 6761.95 6761.95 30 0 5 0 TSSYS2 Serviced As Systems - 2 YR > 29

@ -1,5 +1,6 @@
using Gremlin_BlazorServer.Data.DBClasses; using Gremlin_BlazorServer.Data.DBClasses;
using Gremlin_BlazorServer.Data.EntityClasses; using Gremlin_BlazorServer.Data.EntityClasses;
using Microsoft.EntityFrameworkCore;
namespace Gremlin_BlazorServer.Services namespace Gremlin_BlazorServer.Services
{ {
@ -12,14 +13,29 @@ namespace Gremlin_BlazorServer.Services
return gremlinDb.Set<TResult>().ToList(); return gremlinDb.Set<TResult>().ToList();
} }
public IList<TResult> GetAll<TResult>(string include) where TResult : class, IMetadata
{
return gremlinDb.Set<TResult>().Include(include).ToList();
}
public IList<TResult> GetAll<TResult>(Predicate<TResult> search) where TResult : class, IMetadata public IList<TResult> GetAll<TResult>(Predicate<TResult> search) where TResult : class, IMetadata
{ {
return gremlinDb.Set<TResult>().AsEnumerable<TResult>().Where(t => search(t)).ToList(); return gremlinDb.Set<TResult>().AsEnumerable().Where(t => search(t)).ToList();
}
public IList<TResult> GetAll<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata
{
return gremlinDb.Set<TResult>().Include(include).AsEnumerable().Where(t => search(t)).ToList();
}
public TResult? Get<TResult>(Predicate<TResult> search) where TResult : class, IMetadata
{
return gremlinDb.Set<TResult>().AsEnumerable().FirstOrDefault(t => search(t));
} }
public TResult Get<TResult>(Predicate<TResult> search) where TResult : class, IMetadata public TResult? Get<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata
{ {
return gremlinDb.Set<TResult>().AsEnumerable<TResult>().First(t => search(t)); return gremlinDb.Set<TResult>().Include(include).AsEnumerable().FirstOrDefault(t => search(t));
} }
} }
} }

@ -121,7 +121,6 @@ public class GenericTypeController<T> where T : class
try try
{ {
Account result = await gremlinDb.Accounts.FirstAsync(a => a.AccountId.Equals(contact.AccountId)); Account result = await gremlinDb.Accounts.FirstAsync(a => a.AccountId.Equals(contact.AccountId));
gremlinDb.Entry(contact).State = EntityState.Unchanged;
return result; return result;
} }
catch (Exception e) catch (Exception e)

@ -51,9 +51,9 @@ namespace Gremlin_BlazorServer.Services
return true; return true;
} }
public async Task<StringBuilder> CreateTex(Quote quote) public StringBuilder CreateTex(Quote quote)
{ {
StringBuilder texString = await texService.CreateTexAsync(quote); StringBuilder texString = texService.CreateTex(quote);
Debug.WriteLine(texString.Length > 0 ? "Creating TexFile succesfully." : "Error during TexFile creation!"); Debug.WriteLine(texString.Length > 0 ? "Creating TexFile succesfully." : "Error during TexFile creation!");
return texString; return texString;
} }

@ -6,44 +6,43 @@ namespace Gremlin_BlazorServer.Services
{ {
public class TexService public class TexService
{ {
private readonly GenericController genericController = new();
private readonly GenericTypeController<Account> accountService = new(); private readonly GenericTypeController<Account> accountService = new();
private readonly GenericTypeController<CustomDescription> customDescriptionService = new(); private readonly GenericTypeController<CustomDescription> customDescriptionService = new();
public async Task<StringBuilder> CreateTexAsync(Quote quote) public StringBuilder CreateTex(Quote quote)
{ {
StringBuilder texStringBuilder = await CreateTexFileAsync(quote); StringBuilder texStringBuilder = CreateTexFile(quote);
string correctedTex = Replace(texStringBuilder.ToString()); string correctedTex = Replace(texStringBuilder.ToString());
return new(correctedTex); return new(correctedTex);
} }
private async Task<StringBuilder> CreateBriefkopfAsync(Contact contact, bool tex = false) private StringBuilder CreateBriefkopf(Contact recipient, bool tex = false)
{ {
StringBuilder briefkopf = new(); StringBuilder briefkopf = new();
_ = contact.Gender == (byte)Gender.Male _ = recipient.Gender == (byte)Gender.Male
? briefkopf.AppendLine($"Herr {contact.FirstName} {contact.LastName}") ? briefkopf.AppendLine($"Herr {recipient.FirstName} {recipient.LastName}")
: briefkopf.AppendLine($"Frau {contact.FirstName} {contact.LastName}"); : briefkopf.AppendLine($"Frau {recipient.FirstName} {recipient.LastName}");
if (tex) briefkopf.AppendLine($"\\\\"); if (tex) briefkopf.AppendLine($"\\\\");
Account account = await accountService.GetAccountAsync(contact);
//AccountNamen mit "&" im Namen abfangen //AccountNamen mit "&" im Namen abfangen
account.AccountName = account.AccountName.Replace("&", "\\&"); recipient.Account.AccountName = recipient.Account.AccountName.Replace("&", "\\&");
briefkopf.AppendLine($"{account.AccountName}"); briefkopf.AppendLine($"{recipient.Account.AccountName}");
if (tex) { briefkopf.AppendLine($"\\\\"); } if (tex) { briefkopf.AppendLine($"\\\\"); }
briefkopf.AppendLine($"{account.Street}"); briefkopf.AppendLine($"{recipient.Account.Street}");
if (tex) { briefkopf.AppendLine($"\\\\"); } if (tex) { briefkopf.AppendLine($"\\\\"); }
briefkopf.AppendLine($"{account.Zip} {account.City}"); briefkopf.AppendLine($"{recipient.Account.Zip} {recipient.Account.City}");
if (tex) { briefkopf.AppendLine($"\\\\"); } if (tex) { briefkopf.AppendLine($"\\\\"); }
return briefkopf; return briefkopf;
} }
private async Task<StringBuilder> CreateTexFileAsync(Quote quote) private StringBuilder CreateTexFile(Quote quote)
{ {
const string rand = "2"; //RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "texRand"); const string rand = "2"; //RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "texRand");
@ -97,7 +96,7 @@ namespace Gremlin_BlazorServer.Services
texFile.AppendLine($"Mobil:&{quote.SalesRep.MobileNumber}\\\\"); texFile.AppendLine($"Mobil:&{quote.SalesRep.MobileNumber}\\\\");
texFile.AppendLine($"E-Mail:&\\href{{mailto:{quote.SalesRep.EMail}}}{{{quote.SalesRep.EMail}}}\\\\"); texFile.AppendLine($"E-Mail:&\\href{{mailto:{quote.SalesRep.EMail}}}{{{quote.SalesRep.EMail}}}\\\\");
texFile.AppendLine("\\textbf{Auftragsannahme:}&\\href{mailto:salesservices\\_germany@agilent.com}{salesservices\\_germany@agilent.com}\\\\\n\\hline\n\\end{tabular}\n}\\\\"); texFile.AppendLine("\\textbf{Auftragsannahme:}&\\href{mailto:salesservices\\_germany@agilent.com}{salesservices\\_germany@agilent.com}\\\\\n\\hline\n\\end{tabular}\n}\\\\");
texFile.Append(await CreateBriefkopfAsync(quote.Recipient, true)); texFile.Append(CreateBriefkopf(quote.Recipient, true));
texFile.AppendLine("&\\\\\n&\\\\\n\\end{tabular}\n\\vspace{1cm}\\par "); texFile.AppendLine("&\\\\\n&\\\\\n\\end{tabular}\n\\vspace{1cm}\\par ");
//Anrede //Anrede
@ -106,10 +105,10 @@ namespace Gremlin_BlazorServer.Services
: texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par "); : texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par ");
//Anschreiben //Anschreiben
texFile.AppendLine(await CreateCoverletterAsync(quote)); texFile.AppendLine(CreateCoverletter(quote));
//RB-Disclaimer //RB-Disclaimer
if (quote.QuoteContainsRb) texFile.AppendLine(await CreateRbDisclaimerAsync(quote)); if (quote.QuoteContainsRb) texFile.AppendLine(CreateRbDisclaimer(quote));
//Tabelle //Tabelle
texFile.AppendLine("\\begin{center}"); texFile.AppendLine("\\begin{center}");
@ -140,7 +139,7 @@ namespace Gremlin_BlazorServer.Services
foreach (LineItem lI in quote.LineItems) foreach (LineItem lI in quote.LineItems)
{ {
string lineItemTex = ""; string lineItemTex = "";
CustomDescription cD = await customDescriptionService.GetCustomDescriptionAsync(lI); CustomDescription cD = genericController.Get<CustomDescription>(cD => cD.ProductNumber.Equals(lI.ProductNumber) && cD.OptionNumber.Equals(lI.OptionNumber)) ?? new(); // TODO: adding of new CustomDescription with suggestions
switch (quote.ShowSinglePrices) switch (quote.ShowSinglePrices)
{ {
@ -214,7 +213,7 @@ namespace Gremlin_BlazorServer.Services
return texFile; return texFile;
} }
private async Task<string> CreateRbDisclaimerAsync(Quote quote) private string CreateRbDisclaimer(Quote quote)
{ {
Random r = new(); Random r = new();
@ -227,9 +226,17 @@ namespace Gremlin_BlazorServer.Services
foreach (LineItem lineItemWithRb in lineItemsWithRb) foreach (LineItem lineItemWithRb in lineItemsWithRb)
{ {
CustomDescription customDescription = await customDescriptionService.GetCustomDescriptionAsync(lineItemWithRb); CustomDescription? customDescription = genericController.Get<CustomDescription>(cD => cD.ProductNumber.Equals(lineItemWithRb.ProductNumber) && cD.OptionNumber.Equals(lineItemWithRb.OptionNumber));
int rbcount = 4; //Get count of RB?
rbDisclaimer += $"{lineItemWithRb.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n"; if (customDescription != null)
{
int rbcount = 4; //Get count of RB?
rbDisclaimer += $"{lineItemWithRb.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n";
}
else
{
//TODO: Create new cD
}
} }
rbDisclaimer += "\\end{tabular}\n\\end{center}\n"; rbDisclaimer += "\\end{tabular}\n\\end{center}\n";
@ -262,21 +269,19 @@ namespace Gremlin_BlazorServer.Services
return dreipp; return dreipp;
} }
private async Task<string> GetCoverletterRowAsync(LineItem lineItem) private string GetCoverletterRow(LineItem lineItem)
{ {
CustomDescription customDescription = await customDescriptionService.GetCustomDescriptionAsync(lineItem); CustomDescription? customDescription = genericController.Get<CustomDescription>(cD => cD.ProductNumber.Equals(lineItem.ProductNumber) && cD.OptionNumber.Equals(lineItem.OptionNumber));
if (customDescription == null) return string.Empty;
return customDescription.CoverletterText == "" return customDescription.CoverletterText == ""
? $"\\item {customDescription.Heading} (\\#{lineItem.Position})\n" ? $"\\item {customDescription.Heading} (\\#{lineItem.Position})\n"
: $"\\item {customDescription.CoverletterText} (\\#{lineItem.Position})\n"; : $"\\item {customDescription.CoverletterText} (\\#{lineItem.Position})\n";
} }
private async Task<string> CreateCoverletterAsync(Quote quote) private string CreateCoverletter(Quote quote)
{ {
bool subitem = false; bool subitem = false;
string coverLetter = $"nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) {quote.Description}.\\\\\n" + "Es umfasst im Einzelnen:\n" + "\\begin{itemize}\n";
string coverLetter = $"nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) {quote.Description}.\\\\\n"
+ "Es umfasst im Einzelnen:\n"
+ "\\begin{itemize}\n";
foreach (LineItem lineItem in quote.LineItems) foreach (LineItem lineItem in quote.LineItems)
{ {
@ -299,7 +304,7 @@ namespace Gremlin_BlazorServer.Services
coverLetter += "\\begin{itemize}\n"; coverLetter += "\\begin{itemize}\n";
} }
} }
coverLetter += await GetCoverletterRowAsync(lineItem); coverLetter += GetCoverletterRow(lineItem);
} }
if (subitem) if (subitem)