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

@ -8,39 +8,39 @@ namespace Gremlin_BlazorServer.Data.DBClasses
{
public void Configure(EntityTypeBuilder<Account> accountEntity)
{
_ = accountEntity.HasKey(e => e.AccountId);
_ = 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.SubMarket).WithMany(p => p.Accounts).IsRequired().OnDelete(DeleteBehavior.Restrict);
_ = accountEntity.HasAlternateKey(e => e.SapAccountNumber); // =Unique
_ = accountEntity.Property(e => e.AccountId).ValueGeneratedOnAdd();
_ = accountEntity.Property(e => e.ParentAccountId).HasDefaultValue(0);
_ = accountEntity.Property(e => e.AccountName).IsRequired().HasMaxLength(250);
_ = accountEntity.Property(e => e.Notes).HasDefaultValue("");
_ = accountEntity.Property(e => e.Street).IsRequired().HasMaxLength(100);
_ = accountEntity.Property(e => e.Zip).IsRequired().HasColumnType("Char(5)");
_ = accountEntity.Property(e => e.City).IsRequired().HasMaxLength(50);
_ = accountEntity.Property(e => e.FloorOrBuilding).HasMaxLength(50);
_ = accountEntity.Property(e => e.Longitude).HasDefaultValue(0);
_ = accountEntity.Property(e => e.Latitude).HasDefaultValue(0);
_ = accountEntity.Property(e => e.PhoneNumber).IsRequired().HasMaxLength(30);
_ = accountEntity.Property(e => e.FaxNumber).HasMaxLength(30).HasDefaultValue("");
_ = accountEntity.Property(e => e.Webpage).HasMaxLength(250).HasDefaultValue("");
_ = accountEntity.Property(e => e.EMail).HasMaxLength(150).HasDefaultValue("");
_ = accountEntity.Property(e => e.SapAccountNumber).IsRequired();
_ = accountEntity.Property(e => e.AccountCreatedInSapOn).IsRequired();
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = accountEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = accountEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = accountEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
accountEntity.HasKey(e => e.AccountId);
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.SubMarket).WithMany(p => p.Accounts).IsRequired().OnDelete(DeleteBehavior.Restrict);
accountEntity.HasAlternateKey(e => e.SapAccountNumber); // =Unique
accountEntity.Property(e => e.AccountId).ValueGeneratedOnAdd();
accountEntity.Property(e => e.ParentAccountId).HasDefaultValue(0);
accountEntity.Property(e => e.AccountName).IsRequired().HasMaxLength(250);
accountEntity.Property(e => e.Notes).HasDefaultValue("");
accountEntity.Property(e => e.Street).IsRequired().HasMaxLength(100);
accountEntity.Property(e => e.Zip).IsRequired().HasColumnType("Char(5)");
accountEntity.Property(e => e.City).IsRequired().HasMaxLength(50);
accountEntity.Property(e => e.FloorOrBuilding).HasMaxLength(50);
accountEntity.Property(e => e.Longitude).HasDefaultValue(0);
accountEntity.Property(e => e.Latitude).HasDefaultValue(0);
accountEntity.Property(e => e.PhoneNumber).IsRequired().HasMaxLength(30);
accountEntity.Property(e => e.FaxNumber).HasMaxLength(30).HasDefaultValue("");
accountEntity.Property(e => e.Webpage).HasMaxLength(250).HasDefaultValue("");
accountEntity.Property(e => e.EMail).HasMaxLength(150).HasDefaultValue("");
accountEntity.Property(e => e.SapAccountNumber).IsRequired();
accountEntity.Property(e => e.AccountCreatedInSapOn).IsRequired();
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
accountEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
accountEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
accountEntity.Property(e => e.DataStatus).IsRequired().HasDefaultValue("Active");
//.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)
_ = 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)
{
_ = contactEntity.HasKey(e => e.ContactId);
_ = contactEntity.HasOne(p => p.Account).WithMany(d => d.Contacts).IsRequired();
contactEntity.HasKey(e => e.ContactId);
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);
_ = contactEntity.Property(e => e.ContactId);
_ = contactEntity.Property(e => e.SapContactNumber).IsRequired();
_ = contactEntity.Property(e => e.AcademicTitle).HasDefaultValue("");
_ = contactEntity.Property(e => e.FirstName).HasDefaultValue("");
_ = contactEntity.Property(e => e.LastName).IsRequired();
_ = contactEntity.Property(e => e.Gender).HasDefaultValue(0);
contactEntity.Property(e => e.ContactId);
contactEntity.Property(e => e.SapContactNumber).IsRequired();
contactEntity.Property(e => e.AcademicTitle).HasDefaultValue("");
contactEntity.Property(e => e.FirstName).HasDefaultValue("");
contactEntity.Property(e => e.LastName).IsRequired();
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).
_ = contactEntity.Property(e => e.OptInStatus).HasDefaultValue(false);
_ = contactEntity.Property(e => e.IsReference).HasDefaultValue(false);
_ = contactEntity.Property(e => e.Notes).HasDefaultValue("");
_ = contactEntity.Property(e => e.ValidatedContact).HasDefaultValue(false);
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = contactEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = contactEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = contactEntity.Property(e => e.DataStatus).IsRequired();
contactEntity.Property(e => e.OptInStatus).HasDefaultValue(false);
contactEntity.Property(e => e.IsReference).HasDefaultValue(false);
contactEntity.Property(e => e.Notes).HasDefaultValue("");
contactEntity.Property(e => e.ValidatedContact).HasDefaultValue(false);
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
contactEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
contactEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
contactEntity.Property(e => e.DataStatus).IsRequired();
//.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)
_ = 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)
{
_ = quoteEntity.HasKey(e => e.QuoteId);
_ = 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.QuotationDate).IsRequired().ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.ValidUntil);
_ = quoteEntity.Property(e => e.ValidFor).IsRequired();
_ = quoteEntity.Ignore("SalesRep");
_ = quoteEntity.Property(e => e.TotalListprice);
_ = quoteEntity.Property(e => e.TotalDiscount);
_ = quoteEntity.Property(e => e.TotalNet);
_ = quoteEntity.Property(e => e.Vat);
_ = quoteEntity.Property(e => e.TotalGross);
_ = quoteEntity.Property(e => e.QuoteContains3Pp).HasDefaultValue(false);
_ = quoteEntity.Property(e => e.QuoteContainsRb).HasDefaultValue(false);
_ = quoteEntity.Property(e => e.QuoteTemplate).HasDefaultValue("");
_ = quoteEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = quoteEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = 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.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()");
quoteEntity.HasKey(e => e.QuoteId);
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.QuotationDate).IsRequired().ValueGeneratedOnAdd();
quoteEntity.Property(e => e.ValidUntil);
quoteEntity.Property(e => e.ValidFor).IsRequired();
//SW
quoteEntity.HasOne(e => e.Recipient).WithMany(c => c.Quotes);
quoteEntity.Ignore("SalesRep");
quoteEntity.Property(e => e.TotalListprice);
quoteEntity.Property(e => e.TotalDiscount);
quoteEntity.Property(e => e.TotalNet);
quoteEntity.Property(e => e.Vat);
quoteEntity.Property(e => e.TotalGross);
quoteEntity.Property(e => e.QuoteContains3Pp).HasDefaultValue(false);
quoteEntity.Property(e => e.QuoteContainsRb).HasDefaultValue(false);
quoteEntity.Property(e => e.QuoteTemplate).HasDefaultValue("");
quoteEntity.Property(e => e.DataCreationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
quoteEntity.Property(e => e.DataValidFrom).HasColumnType("DATETIME").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
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.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)
{
_ = entity.HasKey(e => e.LineItemId);
_ = 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.Amount).IsRequired();
_ = entity.Property(e => e.ProductNumber).IsRequired();
_ = entity.Property(e => e.OptionNumber).HasDefaultValue("");
_ = entity.Property(e => e.SapShortDescription).HasDefaultValue("");
_ = entity.Property(e => e.SapLongDescription).HasDefaultValue("");
_ = entity.Property(e => e.ProductLine).HasDefaultValue("");
_ = entity.Property(e => e.TotalDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.SalesDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.PromotionalDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.ContractualDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.DemoDiscount).IsRequired().HasDefaultValue(0);
_ = entity.Property(e => e.ListPrice).IsRequired();
_ = entity.Property(e => e.ExtendedListPrice).IsRequired();
_ = entity.Property(e => e.NetPrice).IsRequired();
_ = entity.Property(e => e.Total).IsRequired();
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = entity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = entity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
entity.HasKey(e => e.LineItemId);
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.Amount).IsRequired();
entity.Property(e => e.ProductNumber).IsRequired();
entity.Property(e => e.OptionNumber).HasDefaultValue("");
entity.Property(e => e.SapShortDescription).HasDefaultValue("");
entity.Property(e => e.SapLongDescription).HasDefaultValue("");
entity.Property(e => e.ProductLine).HasDefaultValue("");
entity.Property(e => e.TotalDiscount).IsRequired().HasDefaultValue(0);
entity.Property(e => e.SalesDiscount).IsRequired().HasDefaultValue(0);
entity.Property(e => e.PromotionalDiscount).IsRequired().HasDefaultValue(0);
entity.Property(e => e.ContractualDiscount).IsRequired().HasDefaultValue(0);
entity.Property(e => e.DemoDiscount).IsRequired().HasDefaultValue(0);
entity.Property(e => e.ListPrice).IsRequired();
entity.Property(e => e.ExtendedListPrice).IsRequired();
entity.Property(e => e.NetPrice).IsRequired();
entity.Property(e => e.Total).IsRequired();
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
entity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
entity.Property(e => e.DataVersionComment).HasDefaultValue("");
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.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)
{
_ = productEntity.HasKey(e => e.ProductId);
_ = 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.Property(e => e.CustomDescriptionId).IsRequired();
_ = productEntity.Property(e => e.ProductNumber).IsRequired();
_ = productEntity.Property(e => e.OptionNumber).HasDefaultValue("");
_ = productEntity.Property(e => e.SapShortDescription).HasDefaultValue("");
_ = productEntity.Property(e => e.SapLongDescription).HasDefaultValue("");
_ = productEntity.Property(e => e.Weight).HasDefaultValue(0);
_ = productEntity.Property(e => e.ProductStatus).HasDefaultValue("Active");
_ = productEntity.Property(e => e.IntroductionDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
_ = productEntity.Property(e => e.ListPrice).IsRequired();
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = productEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = productEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
productEntity.HasKey(e => e.ProductId);
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.Property(e => e.CustomDescriptionId).IsRequired();
productEntity.Property(e => e.ProductNumber).IsRequired();
productEntity.Property(e => e.OptionNumber).HasDefaultValue("");
productEntity.Property(e => e.SapShortDescription).HasDefaultValue("");
productEntity.Property(e => e.SapLongDescription).HasDefaultValue("");
productEntity.Property(e => e.Weight).HasDefaultValue(0);
productEntity.Property(e => e.ProductStatus).HasDefaultValue("Active");
productEntity.Property(e => e.IntroductionDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP").ValueGeneratedOnAdd();
productEntity.Property(e => e.ListPrice).IsRequired();
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
productEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
productEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
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.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)
{
_ = customDescriptionEntity.HasKey(e => e.CustomDescriptionId);
_ = customDescriptionEntity.HasMany(p => p.Products).WithOne(d => d.CustomDescription).IsRequired(false);
_ = customDescriptionEntity.HasOne(p => p.Supplier).WithMany(d => d.CustomDescriptions).IsRequired();
_ = customDescriptionEntity.Property(e => e.ProductNumber).IsRequired();
_ = customDescriptionEntity.Property(e => e.OptionNumber).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.Heading).IsRequired();
_ = customDescriptionEntity.Property(e => e.DescriptionText).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.CoverletterText).HasDefaultValue("");
_ = customDescriptionEntity.Property(e => e.Notes).HasDefaultValue("");
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = customDescriptionEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = customDescriptionEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
customDescriptionEntity.HasKey(e => e.CustomDescriptionId);
customDescriptionEntity.HasMany(p => p.Products).WithOne(d => d.CustomDescription).IsRequired(false);
customDescriptionEntity.HasOne(p => p.Supplier).WithMany(d => d.CustomDescriptions).IsRequired();
customDescriptionEntity.Property(e => e.ProductNumber).IsRequired();
customDescriptionEntity.Property(e => e.OptionNumber).HasDefaultValue("");
customDescriptionEntity.Property(e => e.Heading).IsRequired();
customDescriptionEntity.Property(e => e.DescriptionText).HasDefaultValue("");
customDescriptionEntity.Property(e => e.CoverletterText).HasDefaultValue("");
customDescriptionEntity.Property(e => e.Notes).HasDefaultValue("");
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
customDescriptionEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
customDescriptionEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
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.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)
{
_ = productLineEntity.HasMany(p => p.Products).WithOne(d => d.ProductLine).IsRequired().OnDelete(DeleteBehavior.Restrict);
_ = productLineEntity.Property(e => e.ProductLineDescription).IsRequired();
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = productLineEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = productLineEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
productLineEntity.HasMany(p => p.Products).WithOne(d => d.ProductLine).IsRequired().OnDelete(DeleteBehavior.Restrict);
productLineEntity.Property(e => e.ProductLineDescription).IsRequired();
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
productLineEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
productLineEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
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.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.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.AccountTypeDescription).HasColumnType("Varchar(1000)").IsRequired();
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = accountTypeEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = accountTypeEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
accountTypeEntity.Property(e => e.AccountTypeCode).IsRequired().HasColumnType("Char(3)");
accountTypeEntity.Property(e => e.AccountTypeDescription).HasColumnType("Varchar(1000)").IsRequired();
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
accountTypeEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
accountTypeEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
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.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.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.SubMarketDescription).HasColumnType("Varchar(1000)").IsRequired();
_ = 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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
_ = subMarketEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
_ = subMarketEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired().HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
subMarketEntity.Property(e => e.SubMarketCode).HasColumnType("Char(3)");
subMarketEntity.Property(e => e.SubMarketDescription).HasColumnType("Varchar(1000)").IsRequired();
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.DataValidUntil).HasColumnType("DATETIME").HasDefaultValueSql("'9999-12-31 23:59:59.000000'").ValueGeneratedOnAdd();
subMarketEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired();
subMarketEntity.Property(e => e.DataVersionComment).HasDefaultValue("");
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.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)
{
_ = registeredUserEntity.HasKey(e => e.RegisteredUserId);
registeredUserEntity.HasKey(e => e.RegisteredUserId);
_ = registeredUserEntity.HasMany(d => d.RuSettings).WithOne(p => p.RegisteredUser).IsRequired();
_ = registeredUserEntity.Property(e => e.UserName).IsRequired();
_ = registeredUserEntity.Property(e => e.PasswordHash).IsRequired();
registeredUserEntity.HasMany(d => d.RuSettings).WithOne(p => p.RegisteredUser).IsRequired();
registeredUserEntity.Property(e => e.UserName).IsRequired();
registeredUserEntity.Property(e => e.PasswordHash).IsRequired();
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
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.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)
{
_ = rUSettingsEntitity.HasKey(e => e.RuSettingsId);
rUSettingsEntitity.HasKey(e => e.RuSettingsId);
_ = rUSettingsEntitity.HasOne(d => d.RegisteredUser).WithMany(p => p.RuSettings).IsRequired();
_ = rUSettingsEntitity.Property(e => e.SettingKey).IsRequired();
_ = rUSettingsEntitity.Property(e => e.SettingValue).IsRequired();
rUSettingsEntitity.HasOne(d => d.RegisteredUser).WithMany(p => p.RuSettings).IsRequired();
rUSettingsEntitity.Property(e => e.SettingKey).IsRequired();
rUSettingsEntitity.Property(e => e.SettingValue).IsRequired();
_ = 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.DataModificationByUser).HasColumnType("TINYTEXT").HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()");
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.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.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();

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

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

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

@ -5,12 +5,13 @@
@using System.Globalization;
@using System.Diagnostics
@inject GenericController genericController
@inject GenericTypeController<Quote> QuoteService
@inject GenericTypeController<Contact> ContactService
@inject GenericTypeController<Account> AccountService
@inject GenericTypeController<CustomDescription> CustomDescriptionService
@inject QuoteHandling QuoteHandling
@inject NavigationManager NavigationManager
@inject NavigationManager navigationManager
<h1>Create New Quote</h1>
@ -27,80 +28,83 @@
<DataGridColumn Field="@nameof(Contact.SapContactNumber)" Caption="SAPContactNumber" Sortable Filterable />
</DataGrid>
<h2>Quote Details</h2>
<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)
@if (quote != 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.ProductNumber != "")
{
<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>
<h2>Quote Details</h2>
<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 != 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>
<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>
@if (quote.LineItems == null)
{
<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>
<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 {
private IList<Contact> contacts;
private Quote quote;
private Quote quote = new();
private Contact selectedContact;
private LineItem selectedLineItem;
private CustomDescription customDescriptionOfSelectedLineItem;
@ -108,21 +112,13 @@
protected override async Task OnParametersSetAsync()
{
contacts = await ContactService.GetAllAsync();
selectedContact = contacts.First();
//Resolve account if not present
if (selectedContact.Account.AccountId == 0)
{
selectedContact.Account = await AccountService.GetAccountAsync(selectedContact);
await ContactService.UpdateAsync(selectedContact);
contacts = genericController.GetAll<Contact>("Account");
await GenerateNewQuote("Woitschetzki");
}
}
await OnSelectedContactChanged(selectedContact);
quote.Recipient = selectedContact;
quote.SalesRep = await ContactService.GetContactAsync("Woitschetzki");
private async Task GenerateNewQuote(string salesRep)
{
quote.SalesRep = genericController.Get<Contact>(c => c.LastName == salesRep);
quote.QuoteId = await QuoteService.GetLastId() + 1;
quote.QuotationNumber = quote.SalesRep.LastName switch
{
@ -167,21 +163,21 @@
private async Task OnSelectedContactChanged(Contact sC)
{
selectedContact = sC;
selectedContact.Account = await AccountService.GetAccountAsync(selectedContact);
quote.Recipient = selectedContact;
}
private async void OnSave()
{
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();
FileService.WriteTexFile(quote);
return Task.CompletedTask;
}
private void OnCreatePdf() => PdfService.CreatePdf(quote);
@ -236,16 +232,11 @@
return Task.CompletedTask;
}
private async Task OnCancel()
{
await QuoteService.DeleteAsync(quote);
NavigationManager.NavigateTo("Quotes/QuoteIndex");
}
private async Task OnCancel() => navigationManager.NavigateTo("Quotes/QuoteIndex");
private async Task OnSelectedLineItemChanged(LineItem lineItem)
private async Task OnSelectedLineItemChanged(LineItem lI)
{
selectedLineItem = lineItem;
customDescriptionOfSelectedLineItem = await CustomDescriptionService.GetCustomDescriptionAsync(lineItem);
selectedLineItem = lI;
customDescriptionOfSelectedLineItem = genericController.Get<CustomDescription>(cD => cD.ProductNumber == lI.ProductNumber && cD.OptionNumber == lI.OptionNumber);
}
}

@ -5,14 +5,14 @@
@using System.Globalization;
@inject GenericController genericController
@inject NavigationManager navigationManager
<AuthorizeView>
<Authorized>
<h1>Quotes</h1>
<NavLink class="nav-link" href="Quotes/QuoteAdd">
<span class="oi oi-plus" aria-hidden="true">Create New Quote</span>
</NavLink>
<h1>Quotes</h1>
<Button Color="Color.Primary" Clicked="@OnCreateNewQuote">Create New Quote</Button>
<AuthorizeView>
<Authorized>
@if (quotes != null)
{
<DataGrid TItem="Quote" Data="@quotes" SelectedRow="@selectedQuote" SelectedRowChanged="@OnSelectedQuoteChanged" ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
@ -50,9 +50,9 @@
<Column ColumnSize="ColumnSize.Is3">
<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>
</Column>
</Column>lineItemsInSelectedQuote
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" ReadOnly Checked="@selectedQuote.IsPriceInformation">Preisinformation</Check>
@ -102,22 +102,26 @@
</AuthorizeView>
@code {
private Task<AuthenticationState>? authenticationStateTask { get; set; }
private IList<Quote>? quotes;
private Quote? selectedQuote;
private Contact? recipient;
//private Contact? recipient;
private IList<LineItem>? lineItemsInSelectedQuote;
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;
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);
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.EntityClasses;
using Microsoft.EntityFrameworkCore;
namespace Gremlin_BlazorServer.Services
{
@ -11,15 +12,30 @@ namespace Gremlin_BlazorServer.Services
{
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
{
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
{
Account result = await gremlinDb.Accounts.FirstAsync(a => a.AccountId.Equals(contact.AccountId));
gremlinDb.Entry(contact).State = EntityState.Unchanged;
return result;
}
catch (Exception e)

@ -51,9 +51,9 @@ namespace Gremlin_BlazorServer.Services
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!");
return texString;
}

@ -6,44 +6,43 @@ namespace Gremlin_BlazorServer.Services
{
public class TexService
{
private readonly GenericController genericController = new();
private readonly GenericTypeController<Account> accountService = 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());
return new(correctedTex);
}
private async Task<StringBuilder> CreateBriefkopfAsync(Contact contact, bool tex = false)
private StringBuilder CreateBriefkopf(Contact recipient, bool tex = false)
{
StringBuilder briefkopf = new();
_ = contact.Gender == (byte)Gender.Male
? briefkopf.AppendLine($"Herr {contact.FirstName} {contact.LastName}")
: briefkopf.AppendLine($"Frau {contact.FirstName} {contact.LastName}");
_ = recipient.Gender == (byte)Gender.Male
? briefkopf.AppendLine($"Herr {recipient.FirstName} {recipient.LastName}")
: briefkopf.AppendLine($"Frau {recipient.FirstName} {recipient.LastName}");
if (tex) briefkopf.AppendLine($"\\\\");
Account account = await accountService.GetAccountAsync(contact);
//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($"\\\\"); }
briefkopf.AppendLine($"{account.Street}");
briefkopf.AppendLine($"{recipient.Account.Street}");
if (tex) { briefkopf.AppendLine($"\\\\"); }
briefkopf.AppendLine($"{account.Zip} {account.City}");
briefkopf.AppendLine($"{recipient.Account.Zip} {recipient.Account.City}");
if (tex) { briefkopf.AppendLine($"\\\\"); }
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");
@ -97,7 +96,7 @@ namespace Gremlin_BlazorServer.Services
texFile.AppendLine($"Mobil:&{quote.SalesRep.MobileNumber}\\\\");
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.Append(await CreateBriefkopfAsync(quote.Recipient, true));
texFile.Append(CreateBriefkopf(quote.Recipient, true));
texFile.AppendLine("&\\\\\n&\\\\\n\\end{tabular}\n\\vspace{1cm}\\par ");
//Anrede
@ -106,10 +105,10 @@ namespace Gremlin_BlazorServer.Services
: texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par ");
//Anschreiben
texFile.AppendLine(await CreateCoverletterAsync(quote));
texFile.AppendLine(CreateCoverletter(quote));
//RB-Disclaimer
if (quote.QuoteContainsRb) texFile.AppendLine(await CreateRbDisclaimerAsync(quote));
if (quote.QuoteContainsRb) texFile.AppendLine(CreateRbDisclaimer(quote));
//Tabelle
texFile.AppendLine("\\begin{center}");
@ -140,7 +139,7 @@ namespace Gremlin_BlazorServer.Services
foreach (LineItem lI in quote.LineItems)
{
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)
{
@ -214,7 +213,7 @@ namespace Gremlin_BlazorServer.Services
return texFile;
}
private async Task<string> CreateRbDisclaimerAsync(Quote quote)
private string CreateRbDisclaimer(Quote quote)
{
Random r = new();
@ -227,9 +226,17 @@ namespace Gremlin_BlazorServer.Services
foreach (LineItem lineItemWithRb in lineItemsWithRb)
{
CustomDescription customDescription = await customDescriptionService.GetCustomDescriptionAsync(lineItemWithRb);
int rbcount = 4; //Get count of RB?
rbDisclaimer += $"{lineItemWithRb.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n";
CustomDescription? customDescription = genericController.Get<CustomDescription>(cD => cD.ProductNumber.Equals(lineItemWithRb.ProductNumber) && cD.OptionNumber.Equals(lineItemWithRb.OptionNumber));
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";
@ -262,21 +269,19 @@ namespace Gremlin_BlazorServer.Services
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 == ""
? $"\\item {customDescription.Heading} (\\#{lineItem.Position})\n"
: $"\\item {customDescription.CoverletterText} (\\#{lineItem.Position})\n";
}
private async Task<string> CreateCoverletterAsync(Quote quote)
private string CreateCoverletter(Quote quote)
{
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)
{
@ -299,7 +304,7 @@ namespace Gremlin_BlazorServer.Services
coverLetter += "\\begin{itemize}\n";
}
}
coverLetter += await GetCoverletterRowAsync(lineItem);
coverLetter += GetCoverletterRow(lineItem);
}
if (subitem)