diff --git a/Gremlin_BlazorServer/Data/DBClasses/DbHelper.cs b/Gremlin_BlazorServer/Data/DBClasses/DbHelper.cs index 4035656..9b548c8 100644 --- a/Gremlin_BlazorServer/Data/DBClasses/DbHelper.cs +++ b/Gremlin_BlazorServer/Data/DBClasses/DbHelper.cs @@ -31,9 +31,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses isConnected = true; } - catch (ArgumentException a_ex) + catch (ArgumentException aEx) { - Debug.WriteLine(a_ex.Message); + Debug.WriteLine(aEx.Message); } catch (MySqlException ex) @@ -48,8 +48,6 @@ namespace Gremlin_BlazorServer.Data.DBClasses break; case 0: // Access denied (Check DB name,username,password) break; - default: - break; } } @@ -62,21 +60,17 @@ namespace Gremlin_BlazorServer.Data.DBClasses } public static void DbBuilder() - ///Deletes existing database and builds it from scratch (code first). { - using (GremlinContext gremlinContext = new()) - { - _ = gremlinContext.Database.EnsureDeleted(); - _ = gremlinContext.Database.EnsureCreated(); - } + using GremlinContext gremlinContext = new(); + _ = gremlinContext.Database.EnsureDeleted(); + _ = gremlinContext.Database.EnsureCreated(); } public static void DbInitializer() - /// Initialzes the Db with enum data: product lines, account types, submarkets { //PRODUCT LINES - string[] ProductLineAbbrviations = { "XF", "LM", "XA", "RB", "GE", + string[] productLineAbbreviations = { "XF", "LM", "XA", "RB", "GE", "9Z", "9P", "9M", "9K", "9H", "9F", "9E", "9C", "ZZ", "ZF", "V1", "MB", "MA", "LI", "JW", @@ -86,7 +80,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses "RP", "CD", "PT", "XB", "RM", "GS", "AT", "SR", "FS", "BD", "UF", "3P" }; - string[] ProductLineDescriptions = { "Cell Analysis", "Lab Management", "Flow Cell", "Remarketed Instruments", " Genomics", + string[] productLineDescriptions = { "Cell Analysis", "Lab Management", "Flow Cell", "Remarketed Instruments", " Genomics", "Drugs of Abuse", "Sample Prep/Resins", "Research Products", "Dissolution & Other", "Vacuum Products", "AA/OES", "Drugs of Abuse", "Micro GC", "Common PL & Default", "Expedite Freight", "Automation", "Particle Analysis", "Molecular Spectroscopy", "Software and Informatics", "GC Columns", @@ -97,79 +91,73 @@ namespace Gremlin_BlazorServer.Data.DBClasses "Genomics Systems", "Parallel CE Instrument", "Bio Reagents", "Flexible Spending", "Nucleic Acid", "Microfluidics", "3rd Party Product" }; - int length = ProductLineAbbrviations.Length; + int length = productLineAbbreviations.Length; for (int i = 0; i < length; i++) { - ProductLine PlToBeAdded = new() + ProductLine plToBeAdded = new() { - ProductLineCode = ProductLineAbbrviations[i], - ProductLineDescription = ProductLineDescriptions[i], + ProductLineCode = productLineAbbreviations[i], + ProductLineDescription = productLineDescriptions[i], DataStatus = Status.Active.ToString(), DataModificationByUser = "DbInitializer" }; - using (GremlinContext gremlinContext = new()) - { - _ = gremlinContext.ProductLines.Add(PlToBeAdded); - _ = gremlinContext.SaveChanges(); - } + using GremlinContext gremlinContext = new(); + _ = gremlinContext.ProductLines.Add(plToBeAdded); + _ = gremlinContext.SaveChanges(); } //ACCOUNT TYPES - string[] AccountTypes = { "FPC", "FPR", "FPT", "FPV", "FPN", + string[] accountTypes = { "FPC", "FPR", "FPT", "FPV", "FPN", "FPP", "FPG", "FPX", "FPS", "FPA", "FPO", "FPW", "NPU", "NPR", "NPG", "NPH", "SUP" }; - string[] AccountTypeDescription = { "Commercial", "Contract Manufacturing CRM & Contract Research CRO", "Contract Testing", "Instrument IDR Distributor", "Instrument National Distributor", + string[] accountTypeDescription = { "Commercial", "Contract Manufacturing CRM & Contract Research CRO", "Contract Testing", "Instrument IDR Distributor", "Instrument National Distributor", "Foreign Trade Org", "Genomics/CSD Distributor", "Regulated Distributor", "Transactional Reseller", "Value Added Reseller", "OEM", "Occasional resellers", "University", "Research Institute", "Government", "Hospital", "Supplier" }; - length = AccountTypes.Length; + length = accountTypes.Length; for (int i = 0; i < length; i++) { - AccountType ATtoBeAdded = new() + AccountType aTtoBeAdded = new() { - AccountTypeCode = AccountTypes[i], - AccountTypeDescription = AccountTypeDescription[i], + AccountTypeCode = accountTypes[i], + AccountTypeDescription = accountTypeDescription[i], DataStatus = Status.Active.ToString(), }; - _ = MetaDataSetter.ForImport(ATtoBeAdded, "DbInitializer", "DbInitializer"); + _ = MetaDataSetter.ForImport(aTtoBeAdded, "DbInitializer", "DbInitializer"); - using (GremlinContext db = new()) - { - _ = db.AccountTypes.Add(ATtoBeAdded); - _ = db.SaveChanges(); - } + using GremlinContext db = new(); + _ = db.AccountTypes.Add(aTtoBeAdded); + _ = db.SaveChanges(); } //SubMarkets - string[] SubMarketCodes = { "CCH", "CEN", "CFD", "CFR", "CMS", + string[] subMarketCodes = { "CCH", "CEN", "CFD", "CFR", "CMS", "COT", "LPH", "LBT", "LGN", "LRS", "DCT", "LOT", "VEN", "VAR", "SUP" }; - string[] SubMarketDescriptions = { "Chemical & Energy", "Environmental", "Food", "Forensics", "Material Science", + string[] subMarketDescriptions = { "Chemical & Energy", "Environmental", "Food", "Forensics", "Material Science", "CA Other", "Pharmaceutical", "BioPharma", "Generics", "LS Research", "Clinical Testing", "LS Other", "Analytical Instrument Vendor", "VAR-Partner", "Supplier" }; - length = SubMarketCodes.Length; + length = subMarketCodes.Length; for (int i = 0; i < length; i++) { - SubMarket SMtoBeAdded = new() + SubMarket sMtoBeAdded = new() { - SubMarketCode = SubMarketCodes[i], - SubMarketDescription = SubMarketDescriptions[i], + SubMarketCode = subMarketCodes[i], + SubMarketDescription = subMarketDescriptions[i], DataStatus = Status.Active.ToString(), }; - _ = MetaDataSetter.ForImport(SMtoBeAdded, "DbInitializer", "DbInitializer"); + _ = MetaDataSetter.ForImport(sMtoBeAdded, "DbInitializer", "DbInitializer"); - using (GremlinContext db = new()) - { - _ = db.SubMarkets.Add(SMtoBeAdded); - _ = db.SaveChanges(); - } + using GremlinContext db = new(); + _ = db.SubMarkets.Add(sMtoBeAdded); + _ = db.SaveChanges(); } List seedAccounts = new(); @@ -178,9 +166,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "Agilent Technologies", AccountId = 1, Street = "Hewlett-Packard-Str. 8", - ZIP = 76337, + Zip = 76337, City = "Waldbronn", - SAPAccountNumber = 00000001, + SapAccountNumber = 00000001, EMail = "CustomerCare_Germany@agilent.com", PhoneNumber = "+49 800 6031000", DataStatus = Status.Active.ToString(), @@ -200,9 +188,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "Bios Analytical Ltd.", AccountId = 2, Street = "7 South Fens Enterprise Park//Fenton Way//PE16 6WA Chatteris//Cambridgeshire//United Kingdom", - ZIP = 0, + Zip = 0, City = "Chatteris, UNITED KINGDOM", - SAPAccountNumber = 00000002, + SapAccountNumber = 00000002, EMail = "", PhoneNumber = "+44 1354 694377", DataStatus = Status.Active.ToString(), @@ -222,9 +210,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "Huber Kältemaschinenbau AG", AccountId = 3, Street = "Werner-von-Siemens-Straße 1", - ZIP = 77656, + Zip = 77656, City = "Offenburg", - SAPAccountNumber = 00000003, + SapAccountNumber = 00000003, EMail = "sales@huber-online.com", PhoneNumber = "0781 96030", DataStatus = Status.Active.ToString(), @@ -244,9 +232,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "Van der Heijden Labortechnik GmbH", AccountId = 4, Street = "Tramsmeiers Berg 2", - ZIP = 32694, + Zip = 32694, City = "Dörentrup", - SAPAccountNumber = 00000004, + SapAccountNumber = 00000004, EMail = "info@vdh-online.com", PhoneNumber = "05265 945520", DataStatus = Status.Active.ToString(), @@ -266,9 +254,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "OLE DICH Instrumentmakers ApS", AccountId = 5, Street = "18, Taarnfalkevej", - ZIP = 2650, + Zip = 2650, City = "Hvidovre, DENMARK", - SAPAccountNumber = 00000005, + SapAccountNumber = 00000005, EMail = "", PhoneNumber = "+45 36 78 41 85", DataStatus = Status.Active.ToString(), @@ -288,9 +276,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "S-prep GmbH", AccountId = 6, Street = "Im Amann 7", - ZIP = 88662, + Zip = 88662, City = "Überlingen", - SAPAccountNumber = 00000006, + SapAccountNumber = 00000006, EMail = "info@s-prep.com", PhoneNumber = "07551 932696", FaxNumber = "07551-932699", @@ -311,9 +299,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = "Hellma GmbH & Co. KG", AccountId = 7, Street = "Klosterrunsstraße 5", - ZIP = 79379, + Zip = 79379, City = "Müllheim", - SAPAccountNumber = 00000007, + SapAccountNumber = 00000007, EMail = "info.de@hellma.com", PhoneNumber = "07631 1820", DataStatus = Status.Active.ToString(), @@ -328,14 +316,14 @@ namespace Gremlin_BlazorServer.Data.DBClasses }; seedAccounts.Add(hellma); - Account Glasside = new() + Account glasside = new() { AccountName = "Glasside Technologies", AccountId = 8, Street = "Albany House, 82 Avenue Road//PE19 1LH St Neots, Cambridgeshire//United Kingdom", - ZIP = 0, + Zip = 0, City = "St Neots, Cambridgesgire, UNITED KINGDOM", - SAPAccountNumber = 00000008, + SapAccountNumber = 00000008, EMail = "", PhoneNumber = "-/-", DataStatus = Status.Active.ToString(), @@ -348,16 +336,16 @@ namespace Gremlin_BlazorServer.Data.DBClasses SubMarketCode = "SUP" } }; - seedAccounts.Add(Glasside); + seedAccounts.Add(glasside); Account pike = new() { AccountName = "PIKE Technologies Inc.", AccountId = 9, Street = "6125 Cottonwood Drive//Madison, WI 53719//USA", - ZIP = 53719, + Zip = 53719, City = "Madison (WI), USA", - SAPAccountNumber = 00000009, + SapAccountNumber = 00000009, EMail = "info@piketech.com", PhoneNumber = "+1 608 274 2721", FaxNumber = "+1 608 274 0103", @@ -418,126 +406,121 @@ namespace Gremlin_BlazorServer.Data.DBClasses } //RUSetting - List seedRUSettings = new(); + List seedRuSettings = new(); - using (RUSettings saschaName = new()) + using (RuSettings saschaName = new()) { - saschaName.RegisteredUserID = 1; + saschaName.RegisteredUserId = 1; saschaName.SettingKey = "userName"; saschaName.SettingValue = "Dr. Sascha Woitschetzki"; - seedRUSettings.Add(saschaName); + seedRuSettings.Add(saschaName); } - using (RUSettings saschaPhone = new()) + using (RuSettings saschaPhone = new()) { - saschaPhone.RegisteredUserID = 1; + saschaPhone.RegisteredUserId = 1; saschaPhone.SettingKey = "userPhone"; saschaPhone.SettingValue = "+49 208 74129134"; - seedRUSettings.Add(saschaPhone); + seedRuSettings.Add(saschaPhone); } - using (RUSettings saschaMobile = new()) + using (RuSettings saschaMobile = new()) { - saschaMobile.RegisteredUserID = 1; + saschaMobile.RegisteredUserId = 1; saschaMobile.SettingKey = "userMobile"; saschaMobile.SettingValue = "+49 176 22285334"; - seedRUSettings.Add(saschaMobile); + seedRuSettings.Add(saschaMobile); } - using (RUSettings saschaMail = new()) + using (RuSettings saschaMail = new()) { - saschaMail.RegisteredUserID = 1; + saschaMail.RegisteredUserId = 1; saschaMail.SettingKey = "userMail"; saschaMail.SettingValue = "sascha.woitschetzki@non.agilent.com"; - seedRUSettings.Add(saschaMail); + seedRuSettings.Add(saschaMail); } - using (RUSettings saschaTerritoryID = new()) + using (RuSettings saschaTerritoryId = new()) { - saschaTerritoryID.RegisteredUserID = 1; - saschaTerritoryID.SettingKey = "userTerritoryID"; - saschaTerritoryID.SettingValue = "83PE89"; - seedRUSettings.Add(saschaTerritoryID); + saschaTerritoryId.RegisteredUserId = 1; + saschaTerritoryId.SettingKey = "userTerritoryID"; + saschaTerritoryId.SettingValue = "83PE89"; + seedRuSettings.Add(saschaTerritoryId); } - using (RUSettings saschaTexRand = new()) + using (RuSettings saschaTexRand = new()) { - saschaTexRand.RegisteredUserID = 1; + saschaTexRand.RegisteredUserId = 1; saschaTexRand.SettingKey = "texRand"; saschaTexRand.SettingValue = "2"; - seedRUSettings.Add(saschaTexRand); + seedRuSettings.Add(saschaTexRand); } using (GremlinContext db = new()) { - foreach (RUSettings userSetting in seedRUSettings) + foreach (RuSettings userSetting in seedRuSettings) { userSetting.DataCreationDate = DateTime.Now; userSetting.DataModificationByUser = "DB Initializer"; userSetting.DataModificationDate = DateTime.Now; } - db.RUSettings.AddRange(seedRUSettings); + db.RuSettings.AddRange(seedRuSettings); _ = db.SaveChanges(); } } - public static void InsertTestDataIntoDB() + public static void InsertTestDataIntoDb() { - using (GremlinContext db = new()) - { - DateTime now = DateTime.Now; + using GremlinContext db = new(); + Random r = new(); - Random r = new(); - - Contact newContact = new() - { - AcademicTitle = RandomString(9), - FirstName = RandomString(5), - LastName = RandomString(20), - Gender = (byte)Gender.Male, - Department = RandomString(9), - }; - _ = MetaDataSetter.ForImport(newContact, "Tester", "Seeding data for testing."); + Contact newContact = new() + { + AcademicTitle = RandomString(9), + FirstName = RandomString(5), + LastName = RandomString(20), + Gender = (byte)Gender.Male, + Department = RandomString(9), + }; + _ = MetaDataSetter.ForImport(newContact, "Tester", "Seeding data for testing."); - Account newAccount = new() - { - AccountName = RandomString(20), - Street = RandomString(9), - ZIP = Convert.ToUInt32(r.Next(11111, 99999)), - City = RandomString(9), - SAPAccountNumber = Convert.ToUInt32(r.Next(1111111, 99999999)), - EMail = RandomString(9) + "@" + RandomString(9) + "." + RandomString(3), - PhoneNumber = "+49 " + r.Next().ToString(), - }; - _ = MetaDataSetter.ForImport(newAccount, "Tester", "Seeding data for testing."); + Account newAccount = new() + { + AccountName = RandomString(20), + Street = RandomString(9), + Zip = Convert.ToUInt32(r.Next(11111, 99999)), + City = RandomString(9), + SapAccountNumber = Convert.ToUInt32(r.Next(1111111, 99999999)), + EMail = RandomString(9) + "@" + RandomString(9) + "." + RandomString(3), + PhoneNumber = "+49 " + r.Next().ToString(), + }; + _ = MetaDataSetter.ForImport(newAccount, "Tester", "Seeding data for testing."); - AccountType accountType = db.AccountTypes.Where(a => a.AccountTypeCode == "FPC").FirstOrDefault()!; - newAccount.AccountType = accountType; + AccountType accountType = db.AccountTypes.FirstOrDefault(a => a.AccountTypeCode == "FPC")!; + newAccount.AccountType = accountType; - SubMarket subMarket = db.SubMarkets - .Where(a => a.SubMarketCode == "CEN") - .First(); - newAccount.SubMarket = subMarket; - newContact.Account = newAccount; + SubMarket subMarket = db.SubMarkets + .First(a => a.SubMarketCode == "CEN"); + newAccount.SubMarket = subMarket; + newContact.Account = newAccount; - try - { - _ = db.Add(newAccount); - _ = db.SaveChanges(); - _ = db.Add(newContact); - _ = db.SaveChanges(); - Debug.WriteLine($"Account {newAccount.AccountName} mit Contact {newContact.LastName} wurde angelegt."); - } - catch (Exception ex) - { - Debug.WriteLine(ex); - } + try + { + _ = db.Add(newAccount); + _ = db.SaveChanges(); + _ = db.Add(newContact); + _ = db.SaveChanges(); + Debug.WriteLine($"Account {newAccount.AccountName} mit Contact {newContact.LastName} wurde angelegt."); + } + catch (Exception ex) + { + Debug.WriteLine(ex); } } - public static bool ImportContactsFromCsv(string filepath = "", string separator = ";", bool dataHasHeading = true) + private static bool ImportContactsFromCsv(string filepath = "", string separator = ";", bool dataHasHeading = true) { //Pfad abfragen über Dtei-Öffnen-Dialog: if (filepath == "") @@ -551,13 +534,13 @@ namespace Gremlin_BlazorServer.Data.DBClasses return false; } - List ContactsReadFromFile = new(8000); + List contactsReadFromFile = new(8000); // ENCODING CHANGED TO UNICODE. TO BE TESTED! using (TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath))) { //Parser configuration: - csvParser.Delimiters = new string[] { separator }; - csvParser.CommentTokens = new string[] { "#" }; + csvParser.Delimiters = new[] { separator }; + csvParser.CommentTokens = new[] { "#" }; csvParser.HasFieldsEnclosedInQuotes = true; @@ -570,25 +553,25 @@ namespace Gremlin_BlazorServer.Data.DBClasses while (!csvParser.EndOfData) { // Read current line fields, pointer moves to the next line. - Contact ImportedContact = new(); + Contact importedContact = new(); string[] fields = csvParser.ReadFields()!; //No conversion - ImportedContact.AcademicTitle = fields[1]; - ImportedContact.FirstName = fields[3]; - ImportedContact.LastName = fields[4]; - ImportedContact.EMail = fields[6]; - ImportedContact.Department = fields[7]; - ImportedContact.Room = fields[8]; - ImportedContact.PhoneNumber = fields[9]; - ImportedContact.Function = fields[10]; - ImportedContact.MobileNumber = fields[13]; + importedContact.AcademicTitle = fields[1]; + importedContact.FirstName = fields[3]; + importedContact.LastName = fields[4]; + importedContact.EMail = fields[6]; + importedContact.Department = fields[7]; + importedContact.Room = fields[8]; + importedContact.PhoneNumber = fields[9]; + importedContact.Function = fields[10]; + importedContact.MobileNumber = fields[13]; //Convert Gender - ImportedContact.Gender = fields[2] == "M" ? (byte)Gender.Male : fields[2] == "F" ? (byte)Gender.Female : (byte)Gender.Unknown; + importedContact.Gender = fields[2] == "M" ? (byte)Gender.Male : fields[2] == "F" ? (byte)Gender.Female : (byte)Gender.Unknown; //Convert OptIn Status - ImportedContact.OptInStatus = fields[5] switch + importedContact.OptInStatus = fields[5] switch { "Opt In" => true, "Opt Out" => false, @@ -598,7 +581,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses //Convert "SAP Contact Number" try { - ImportedContact.SAPContactNumber = Convert.ToInt32(fields[11], CultureInfo.CurrentCulture); + importedContact.SapContactNumber = Convert.ToInt32(fields[11], CultureInfo.CurrentCulture); } catch (FormatException ex) { @@ -631,32 +614,30 @@ namespace Gremlin_BlazorServer.Data.DBClasses int year = Convert.ToInt32(fields[12].Substring(0, 4), CultureInfo.CurrentCulture); int month = Convert.ToInt32(fields[12].Substring(4, 2), CultureInfo.CurrentCulture); int day = Convert.ToInt32(fields[12].Substring(6, 2), CultureInfo.CurrentCulture); - ImportedContact.SAPContactCreationDate = new DateTime(year, month, day); + importedContact.SapContactCreationDate = new DateTime(year, month, day); //Convert "No Phone Calls" if (fields[26] == "1") { - ImportedContact.NoPhoneCalls = true; + importedContact.NoPhoneCalls = true; } //Convert "No Hardcopy Mailing" if (fields[27] == "1") { - ImportedContact.NoHardcopyMailing = true; + importedContact.NoHardcopyMailing = true; } //SAPAccountID in Contact.Notes speichern, um den entsprechenden Account aus DB heraussuchen zu können: - ImportedContact.Notes = fields[0]; + importedContact.Notes = fields[0]; - ContactsReadFromFile.Add(ImportedContact); + contactsReadFromFile.Add(importedContact); } //Eingelesenen Account in DB schreiben: using (GremlinContext db = new()) { - DateTime now = DateTime.Now; - - foreach (Contact contact in ContactsReadFromFile) + foreach (Contact contact in contactsReadFromFile) { // AccountID aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. contact.Account = ResolveAccountById(db, uint.Parse(contact.Notes)); @@ -664,36 +645,16 @@ namespace Gremlin_BlazorServer.Data.DBClasses _ = MetaDataSetter.ForImport(contact, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportContactsFromCSV)"); } - db.Contacts.AddRange(ContactsReadFromFile); + db.Contacts.AddRange(contactsReadFromFile); _ = db.SaveChanges(); } } //Bestätigung senden - Debug.WriteLine($"Es wurden {ContactsReadFromFile.Count} Contacts erfolgreich der Datenbank hinzugefügt."); + Debug.WriteLine($"Es wurden {contactsReadFromFile.Count} Contacts erfolgreich der Datenbank hinzugefügt."); return true; } - public static bool ImportAccountsFromCsv(string filepath = "", string separator = ";", bool dataHasHeading = true) - ///Importiert Account Daten aus CSV (erstellt aus LSAG_Contact_List_Tool.xlsx) - /// - /// - Encoding: Latin1 - /// - fixe Spaltenzahl und -folge (Überschriften werden nicht untersucht/verwendet): - /// 1) SAPAccountNumber - /// 2) AccountName - /// 3) ZIP - /// 4) City - /// 5) Street - /// 6) AccountSubMarketCode - /// 7) AccountTypeCode - /// 8) PhoneNumber - /// 9) AccountsCreatedInSAP - ///Kommentarzeichen: # (hardcoded, string array) - ///Rückgabe 'false' bei Fehler oder User-Abbruch, ansonsten 'true'. - /// - ///Optionale Argumente: - /// 1. string filepath: Dateipfad zur einzulesenden Datei. Standardwert = "", öffnet OpenFile-Dialog. - /// 2. string separator: Trennzeichen, Standardwert = ";" - /// 3. bool dataHasheadings: true = CSV-Datei enthält Überschriften, false = CSV-Datei enthält keine Überschriften, Standardwert = true + private static bool ImportAccountsFromCsv(string filepath = "", string separator = ";", bool dataHasHeading = true) { //Pfad abfragen über Dtei-Öffnen-Dialog: if (filepath == "") @@ -707,176 +668,168 @@ namespace Gremlin_BlazorServer.Data.DBClasses return false; } - List AccountsReadFromFile = new(1000); + List accountsReadFromFile = new(1000); //ENCODING CHANGED TO ISO-8859-1 AS EQUIVALENT (?) TO "LATIN1" (unavailable). TO BE TESTED! //ich würde mir ja UTF8 als universelles Encoding wünschen - using (TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath))) + using TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath)); + //Parser configuration: + csvParser.Delimiters = new[] { separator }; + csvParser.CommentTokens = new[] { "#" }; + csvParser.HasFieldsEnclosedInQuotes = true; + + // Skip the row with the column names: + if (dataHasHeading) { - //Parser configuration: - csvParser.Delimiters = new string[] { separator }; - csvParser.CommentTokens = new string[] { "#" }; - csvParser.HasFieldsEnclosedInQuotes = true; + _ = csvParser.ReadLine(); + } - // Skip the row with the column names: - if (dataHasHeading) + while (!csvParser.EndOfData) + { + // Read current line fields, pointer moves to the next line. + Account importedAccount = new(); { - _ = csvParser.ReadLine(); + importedAccount.SubMarket = new(); + importedAccount.AccountType = new(); + importedAccount.Contacts = new List(); } + string[] fields = csvParser.ReadFields()!; - while (!csvParser.EndOfData) + //Konvertierung erforderlich: + try { - // Read current line fields, pointer moves to the next line. - Account ImportedAccount = new(); + importedAccount.SapAccountNumber = Convert.ToUInt32(fields[0]); + } + catch (FormatException ex) + { + //errorhandling here: "Unable to parse input: " + field[0] + " as uint" + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[0]; + if (errorRaiser == "") { - ImportedAccount.SubMarket = new(); - ImportedAccount.AccountType = new(); - ImportedAccount.Contacts = new List(); + errorRaiser = "No Account Number in this row!"; } - string[] fields = csvParser.ReadFields()!; - //Konvertierung erforderlich: - try - { - ImportedAccount.SAPAccountNumber = Convert.ToUInt32(fields[0]); - } - catch (FormatException ex) - { - //errorhandling here: "Unable to parse input: " + field[0] + " as uint" - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[0]; - if (errorRaiser == "") - { - errorRaiser = "No Account Number in this row!"; - } - - DisplayErrorDetails(ex, errorRaiser); - return false; - } - catch (OverflowException ex) + DisplayErrorDetails(ex, errorRaiser); + return false; + } + catch (OverflowException ex) + { + //errorhandling here: "Number cannot fit in an Uint." + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[0]; + if (errorRaiser == "") { - //errorhandling here: "Number cannot fit in an Uint." - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[0]; - if (errorRaiser == "") - { - errorRaiser = "No Account Number in this row!"; - } - - DisplayErrorDetails(ex, errorRaiser); - return false; + errorRaiser = "No Account Number in this row!"; } - try - { - ImportedAccount.ZIP = Convert.ToUInt32(fields[2]); - } - catch (FormatException ex) - { - //errorhandling here: "Unable to parse input: " + field[0] + " as uint" - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[0]; - if (errorRaiser == "") - { - errorRaiser = "No ZIP in this row!"; - } + DisplayErrorDetails(ex, errorRaiser); + return false; + } - DisplayErrorDetails(ex, errorRaiser); - return false; - } - catch (OverflowException ex) + try + { + importedAccount.Zip = Convert.ToUInt32(fields[2]); + } + catch (FormatException ex) + { + //errorhandling here: "Unable to parse input: " + field[0] + " as uint" + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[0]; + if (errorRaiser == "") { - //errorhandling here: "Number cannot fit in an Uint." - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[0]; - if (errorRaiser == "") - { - errorRaiser = "No ZIP in this row!"; - } - - DisplayErrorDetails(ex, errorRaiser); - return false; + errorRaiser = "No ZIP in this row!"; } - //Konvertierung für AccountCreatedinSAPOn Property: - //Test auf Inhalt - if (fields[8].Length != 0) + DisplayErrorDetails(ex, errorRaiser); + return false; + } + catch (OverflowException ex) + { + //errorhandling here: "Number cannot fit in an Uint." + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[0]; + if (errorRaiser == "") { - int year = Convert.ToInt32(fields[8].Substring(0, 4)); - int month = Convert.ToInt32(fields[8].Substring(4, 2)); - int day = Convert.ToInt32(fields[8].Substring(6, 2)); - ImportedAccount.AccountCreatedInSAPOn = new DateTime(year, month, day); + errorRaiser = "No ZIP in this row!"; } - //keine Konvertierung nötig: - ImportedAccount.AccountName = fields[1]; - ImportedAccount.City = fields[3]; - ImportedAccount.Street = fields[4]; - ImportedAccount.SubMarket.SubMarketCode = fields[5]; - ImportedAccount.SubMarket.DataStatus = Status.Active.ToString(); - ImportedAccount.AccountType.AccountTypeCode = fields[6]; - ImportedAccount.AccountType.DataStatus = Status.Active.ToString(); - ImportedAccount.PhoneNumber = fields[7]; - ImportedAccount.DataStatus = Status.Active.ToString(); - - AccountsReadFromFile.Add(ImportedAccount); + DisplayErrorDetails(ex, errorRaiser); + return false; } - //Eingelesenen Account in DB schreiben: - using (GremlinContext db = new()) + //Konvertierung für AccountCreatedinSAPOn Property: + //Test auf Inhalt + if (fields[8].Length != 0) { - DateTime now = DateTime.Now; - - foreach (Account account in AccountsReadFromFile) - { - // AccountType aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. - if (account.AccountType.AccountTypeCode != "") - { - AccountType accountType = db.AccountTypes - .Where(a => a.AccountTypeCode == account.AccountType.AccountTypeCode) - .First(); + int year = Convert.ToInt32(fields[8].Substring(0, 4)); + int month = Convert.ToInt32(fields[8].Substring(4, 2)); + int day = Convert.ToInt32(fields[8].Substring(6, 2)); + importedAccount.AccountCreatedInSapOn = new DateTime(year, month, day); + } - account.AccountType = accountType; - account.AccountType = ResolveAccountType(db, account.AccountType.AccountTypeCode); - } - else - { - //Default - account.AccountType = ResolveAccountType(db, "FPC"); - } + //keine Konvertierung nötig: + importedAccount.AccountName = fields[1]; + importedAccount.City = fields[3]; + importedAccount.Street = fields[4]; + importedAccount.SubMarket.SubMarketCode = fields[5]; + importedAccount.SubMarket.DataStatus = Status.Active.ToString(); + importedAccount.AccountType.AccountTypeCode = fields[6]; + importedAccount.AccountType.DataStatus = Status.Active.ToString(); + importedAccount.PhoneNumber = fields[7]; + importedAccount.DataStatus = Status.Active.ToString(); + + accountsReadFromFile.Add(importedAccount); + } - if (account.SubMarket.SubMarketCode != "") - { - SubMarket subMarket = db.SubMarkets - .Where(a => a.SubMarketCode == account.SubMarket.SubMarketCode) - .First(); + //Eingelesenen Account in DB schreiben: + using GremlinContext db = new(); + foreach (Account account in accountsReadFromFile) + { + // AccountType aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. + if (account.AccountType.AccountTypeCode != "") + { + AccountType accountType = db.AccountTypes + .First(a => a.AccountTypeCode == account.AccountType.AccountTypeCode); - account.SubMarket = subMarket; - //Warum gelöscht? account.AccountType = ResolveAccountType(db, account.AccountType.AccountTypeCode); - account.SubMarket = ResolveSubmarket(db, account.SubMarket.SubMarketCode); + account.AccountType = accountType; + account.AccountType = ResolveAccountType(db, account.AccountType.AccountTypeCode); + } + else + { + //Default + account.AccountType = ResolveAccountType(db, "FPC"); + } - } - else - { - //Default - account.SubMarket = ResolveSubmarket(db, "COT"); - } - _ = MetaDataSetter.ForImport(account, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportAccountsFromCSV)"); - } + if (account.SubMarket.SubMarketCode != "") + { + SubMarket subMarket = db.SubMarkets + .First(a => a.SubMarketCode == account.SubMarket.SubMarketCode); - db.Accounts.AddRange(AccountsReadFromFile); - _ = db.SaveChanges(); + account.SubMarket = subMarket; + //Warum gelöscht? account.AccountType = ResolveAccountType(db, account.AccountType.AccountTypeCode); + account.SubMarket = ResolveSubmarket(db, account.SubMarket.SubMarketCode); - //Bestätigung senden - Debug.WriteLine($"Es wurden {AccountsReadFromFile.Count} Accounts erfolgreich der Datenbank hinzugefügt."); } + else + { + //Default + account.SubMarket = ResolveSubmarket(db, "COT"); + } + _ = MetaDataSetter.ForImport(account, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportAccountsFromCSV)"); } + + db.Accounts.AddRange(accountsReadFromFile); + _ = db.SaveChanges(); + + //Bestätigung senden + Debug.WriteLine($"Es wurden {accountsReadFromFile.Count} Accounts erfolgreich der Datenbank hinzugefügt."); + return true; } - public static bool ImportLSAGContactListToolData(string filepath = "", string separator = ";") - ///Importiert Accounts und Contacts aus CSV in die DB + private static bool ImportLsagContactListToolData(string filepath = "", string separator = ";") { if (filepath == "") @@ -889,283 +842,269 @@ namespace Gremlin_BlazorServer.Data.DBClasses return false; //Wenn keine Datei ausgewählt (Cancel geklickt), dann Abbruch: } - List ContactsReadFromFile = new(8000); - List AccountsReadFromFile = new(1000); + List contactsReadFromFile = new(8000); + List accountsReadFromFile = new(1000); - using (TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath))) //ISO-8859-1 entspricht Latin1 - { - //Parser configuration: - csvParser.Delimiters = new string[] { separator }; - csvParser.CommentTokens = new string[] { "#" }; - csvParser.HasFieldsEnclosedInQuotes = true; + using TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath)); + //Parser configuration: + csvParser.Delimiters = new[] { separator }; + csvParser.CommentTokens = new[] { "#" }; + csvParser.HasFieldsEnclosedInQuotes = true; - //dynamische Spaltenzuordnung in Dictonary speichern - Dictionary columnNumberOf = new(); - string[] fields = csvParser.ReadFields()!; - columnNumberOf = ColumnMapping(fields); - //Daten einlesen und Accounts und Kontakte in eigene List bzw List extrahieren. + //dynamische Spaltenzuordnung in Dictonary speichern + string[] fields = csvParser.ReadFields()!; + Dictionary columnNumberOf = ColumnMapping(fields); - while (!csvParser.EndOfData) + //Daten einlesen und Accounts und Kontakte in eigene List bzw List extrahieren. + while (!csvParser.EndOfData) + { + bool dataHasError = false; + Account importedAccount = new(); + Contact importedContact = new(); + importedAccount.SubMarket = new(); + importedAccount.AccountType = new(); + importedContact.Account = new(); + + fields = csvParser.ReadFields()!; // Read current line fields, pointer moves to the next line. + if (fields[0] == "") { - bool DataHasError = false; - Account ImportedAccount = new(); - Contact ImportedContact = new(); - ImportedAccount.SubMarket = new(); - ImportedAccount.AccountType = new(); - ImportedContact.Account = new(); + break; // Am Ende hängt eine leere Zeile, die im Parser einen Fehler auslösen würde. + } - fields = csvParser.ReadFields()!; // Read current line fields, pointer moves to the next line. - if (fields[0] == "") + //Account-Daten + // Konvertierung erforderlich: + try + { + importedAccount.SapAccountNumber = Convert.ToUInt32(fields[columnNumberOf["SAPAccountNumber"]]); + } + catch (FormatException ex) + { + //errorhandling here: "Unable to parse input: " + field[0] + " as uint" + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; + if (errorRaiser == "") { - break; // Am Ende hängt eine leere Zeile, die im Parser einen Fehler auslösen würde. + errorRaiser = "No Contact Number in this row!"; } - //Account-Daten - // Konvertierung erforderlich: - try - { - ImportedAccount.SAPAccountNumber = Convert.ToUInt32(fields[columnNumberOf["SAPAccountNumber"]]); - } - catch (FormatException ex) + DisplayErrorDetails(ex, errorRaiser); + return false; + } + catch (OverflowException ex) + { + //errorhandling here: "Number cannot fit in an Uint." + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; + if (errorRaiser == "") { - //errorhandling here: "Unable to parse input: " + field[0] + " as uint" - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; - if (errorRaiser == "") - { - errorRaiser = "No Contact Number in this row!"; - } - - DisplayErrorDetails(ex, errorRaiser); - return false; + errorRaiser = "No Contact Number in this row!"; } - catch (OverflowException ex) - { - //errorhandling here: "Number cannot fit in an Uint." - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; - if (errorRaiser == "") - { - errorRaiser = "No Contact Number in this row!"; - } - DisplayErrorDetails(ex, errorRaiser); - return false; - } + DisplayErrorDetails(ex, errorRaiser); + return false; + } - try + try + { + importedAccount.Zip = Convert.ToUInt32(fields[columnNumberOf["ZIP"]]); + } + catch (FormatException ex) + { + //errorhandling here: "Unable to parse input: " + field[0] + " as uint" + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; + if (errorRaiser == "") { - ImportedAccount.ZIP = Convert.ToUInt32(fields[columnNumberOf["ZIP"]]); + errorRaiser = "No Contact Number in this row!"; } - catch (FormatException ex) - { - //errorhandling here: "Unable to parse input: " + field[0] + " as uint" - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; - if (errorRaiser == "") - { - errorRaiser = "No Contact Number in this row!"; - } - DisplayErrorDetails(ex, errorRaiser); - return false; - } - catch (OverflowException ex) + DisplayErrorDetails(ex, errorRaiser); + return false; + } + catch (OverflowException ex) + { + //errorhandling here: "Number cannot fit in an Uint." + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; + if (errorRaiser == "") { - //errorhandling here: "Number cannot fit in an Uint." - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; - if (errorRaiser == "") - { - errorRaiser = "No Contact Number in this row!"; - } - - DisplayErrorDetails(ex, errorRaiser); - return false; + errorRaiser = "No Contact Number in this row!"; } - // Konvertierung für AccountCreatedinSAPOn Property: - int year = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(0, 4)); - int month = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(4, 2)); - int day = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(6, 2)); - ImportedAccount.AccountCreatedInSAPOn = new DateTime(year, month, day); - - //Convert City von Großschreibung zu Normalschreibung - ImportedAccount.City = fields[columnNumberOf["City"]].First().ToString() + fields[columnNumberOf["City"]].Substring(1).ToLower(); - - // keine Konvertierung nötig: - ImportedAccount.AccountName = fields[columnNumberOf["AccountName"]]; - ImportedAccount.Street = fields[columnNumberOf["Street"]]; - ImportedAccount.SubMarket.SubMarketCode = fields[columnNumberOf["SubMarketCode"]]; - ImportedAccount.SubMarket.DataStatus = Status.Active.ToString(); - ImportedAccount.AccountType.AccountTypeCode = fields[columnNumberOf["AccountTypeCode"]]; - ImportedAccount.AccountType.DataStatus = Status.Active.ToString(); - ImportedAccount.PhoneNumber = fields[columnNumberOf["AccountPhoneNumber"]]; - ImportedAccount.DataStatus = Status.Active.ToString(); - - - //Validierungen: - if (ImportedAccount.AccountName == "" - || ImportedAccount.City == "" - || ImportedAccount.Street == "" - || ImportedAccount.SubMarket.SubMarketCode == "" - || ImportedAccount.AccountType.AccountTypeCode == "" - || ImportedAccount.SAPAccountNumber == 0) - { - DataHasError = true; - } + DisplayErrorDetails(ex, errorRaiser); + return false; + } - //Validierten Account der Liste hinzufügen: - if (DataHasError == false) - { - _ = ImportedAccount.AddIfUniqueTo(AccountsReadFromFile); - } + // Konvertierung für AccountCreatedinSAPOn Property: + int year = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(0, 4)); + int month = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(4, 2)); + int day = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(6, 2)); + importedAccount.AccountCreatedInSapOn = new DateTime(year, month, day); + + //Convert City von Großschreibung zu Normalschreibung + importedAccount.City = fields[columnNumberOf["City"]].First().ToString() + fields[columnNumberOf["City"]].Substring(1).ToLower(); + + // keine Konvertierung nötig: + importedAccount.AccountName = fields[columnNumberOf["AccountName"]]; + importedAccount.Street = fields[columnNumberOf["Street"]]; + importedAccount.SubMarket.SubMarketCode = fields[columnNumberOf["SubMarketCode"]]; + importedAccount.SubMarket.DataStatus = Status.Active.ToString(); + importedAccount.AccountType.AccountTypeCode = fields[columnNumberOf["AccountTypeCode"]]; + importedAccount.AccountType.DataStatus = Status.Active.ToString(); + importedAccount.PhoneNumber = fields[columnNumberOf["AccountPhoneNumber"]]; + importedAccount.DataStatus = Status.Active.ToString(); + + + //Validierungen: + if (importedAccount.AccountName == "" + || importedAccount.City == "" + || importedAccount.Street == "" + || importedAccount.SubMarket.SubMarketCode == "" + || importedAccount.AccountType.AccountTypeCode == "" + || importedAccount.SapAccountNumber == 0) + { + dataHasError = true; + } + + //Validierten Account der Liste hinzufügen: + if (dataHasError == false) + { + _ = importedAccount.AddIfUniqueTo(accountsReadFromFile); + } - //Contact-Daten - // Ohne Konvertierung - ImportedContact.AcademicTitle = fields[columnNumberOf["AcademicTitle"]]; - ImportedContact.FirstName = fields[columnNumberOf["FirstName"]]; - ImportedContact.LastName = fields[columnNumberOf["LastName"]]; - ImportedContact.EMail = fields[columnNumberOf["EMail"]]; - ImportedContact.Department = fields[columnNumberOf["Department"]]; - ImportedContact.Room = fields[columnNumberOf["Room"]]; - ImportedContact.PhoneNumber = fields[columnNumberOf["PhoneNumber"]]; - ImportedContact.Function = fields[columnNumberOf["Function"]]; - ImportedContact.MobileNumber = fields[columnNumberOf["MobileNumber"]]; + //Contact-Daten + // Ohne Konvertierung + importedContact.AcademicTitle = fields[columnNumberOf["AcademicTitle"]]; + importedContact.FirstName = fields[columnNumberOf["FirstName"]]; + importedContact.LastName = fields[columnNumberOf["LastName"]]; + importedContact.EMail = fields[columnNumberOf["EMail"]]; + importedContact.Department = fields[columnNumberOf["Department"]]; + importedContact.Room = fields[columnNumberOf["Room"]]; + importedContact.PhoneNumber = fields[columnNumberOf["PhoneNumber"]]; + importedContact.Function = fields[columnNumberOf["Function"]]; + importedContact.MobileNumber = fields[columnNumberOf["MobileNumber"]]; - //Convert Gender - ImportedContact.Gender = fields[columnNumberOf["Gender"]] == "M" - ? (byte)Gender.Male - : fields[columnNumberOf["Gender"]] == "F" ? (byte)Gender.Female : (byte)Gender.Unknown; + //Convert Gender + importedContact.Gender = fields[columnNumberOf["Gender"]] == "M" + ? (byte)Gender.Male + : fields[columnNumberOf["Gender"]] == "F" ? (byte)Gender.Female : (byte)Gender.Unknown; - //Convert OptIn Status - ImportedContact.OptInStatus = fields[columnNumberOf["OptInStatus"]] == "Opt In" || (fields[columnNumberOf["OptInStatus"]] == "Opt Out" && false); + //Convert OptIn Status + importedContact.OptInStatus = fields[columnNumberOf["OptInStatus"]] == "Opt In" || (fields[columnNumberOf["OptInStatus"]] == "Opt Out" && false); - //Convert "SAP Contact Number" - try + //Convert "SAP Contact Number" + try + { + importedContact.SapContactNumber = Convert.ToInt32(fields[columnNumberOf["SAPContactNumber"]]); + } + catch (FormatException ex) + { + //errorhandling here: "Unable to parse input: " + field[0] + " as uint" + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; + if (errorRaiser == "") { - ImportedContact.SAPContactNumber = Convert.ToInt32(fields[columnNumberOf["SAPContactNumber"]]); + errorRaiser = "No Contact Number in this row!"; } - catch (FormatException ex) - { - //errorhandling here: "Unable to parse input: " + field[0] + " as uint" - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; - if (errorRaiser == "") - { - errorRaiser = "No Contact Number in this row!"; - } - DisplayErrorDetails(ex, errorRaiser); - return false; - } - catch (OverflowException ex) + DisplayErrorDetails(ex, errorRaiser); + return false; + } + catch (OverflowException ex) + { + //errorhandling here: "Number cannot fit in an Uint." + //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben + string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; + if (errorRaiser == "") { - //errorhandling here: "Number cannot fit in an Uint." - //Zeilennummer, Feld und Wert in Liste speichern, um am Ende gesammelt auszugeben - string errorRaiser = fields[columnNumberOf["SAPContactNumber"]]; - if (errorRaiser == "") - { - errorRaiser = "No Contact Number in this row!"; - } - - DisplayErrorDetails(ex, errorRaiser); - return false; + errorRaiser = "No Contact Number in this row!"; } - //Convert "Account Created on" - year = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(0, 4)); - month = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(4, 2)); - day = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(6, 2)); - ImportedContact.SAPContactCreationDate = new DateTime(year, month, day); + DisplayErrorDetails(ex, errorRaiser); + return false; + } - //Convert "No Phone Calls" - if (fields[columnNumberOf["NoPhoneCalls"]] == "1") - { - ImportedContact.NoPhoneCalls = true; - } + //Convert "Account Created on" + year = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(0, 4)); + month = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(4, 2)); + day = Convert.ToInt32(fields[columnNumberOf["AccountCreatedInSAPOn"]].Substring(6, 2)); + importedContact.SapContactCreationDate = new DateTime(year, month, day); - //Convert "No Hardcopy Mailing" - if (fields[columnNumberOf["NoHardcopyMailing"]] == "1") - { - ImportedContact.NoHardcopyMailing = true; - } + //Convert "No Phone Calls" + if (fields[columnNumberOf["NoPhoneCalls"]] == "1") + { + importedContact.NoPhoneCalls = true; + } - //SAPAccountID in Contact.Notes speichern, um den entsprechenden Account aus DB heraussuchen zu können: - ImportedContact.Notes = fields[columnNumberOf["SAPAccountNumber"]]; + //Convert "No Hardcopy Mailing" + if (fields[columnNumberOf["NoHardcopyMailing"]] == "1") + { + importedContact.NoHardcopyMailing = true; + } - //Validierungen: - if (ImportedContact.EmailBounced || ImportedContact.LastName == "" || ImportedContact.SAPContactNumber == 0) - { - DataHasError = true; - } + //SAPAccountID in Contact.Notes speichern, um den entsprechenden Account aus DB heraussuchen zu können: + importedContact.Notes = fields[columnNumberOf["SAPAccountNumber"]]; - if (ImportedContact.EMail.Length > 7 && ImportedContact.EMail.Substring(0, 8) == "bounced-") - { - DataHasError = true; - } + //Validierungen: + if (importedContact.EmailBounced || importedContact.LastName == "" || importedContact.SapContactNumber == 0) + { + dataHasError = true; + } - //Validierte Kontakte zu Liste hinzufügen: - if (DataHasError == false) - { - ContactsReadFromFile.Add(ImportedContact); - } + if (importedContact.EMail.Length > 7 && importedContact.EMail.Substring(0, 8) == "bounced-") + { + dataHasError = true; } - //Eingelesenen Account in DB schreiben: - using (GremlinContext db = new()) + //Validierte Kontakte zu Liste hinzufügen: + if (dataHasError == false) { - DateTime now = DateTime.Now; + contactsReadFromFile.Add(importedContact); + } + } - foreach (Account account in AccountsReadFromFile) - { - // AccountType aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. - AccountType accountType = db.AccountTypes - .Where(a => a.AccountTypeCode == account.AccountType.AccountTypeCode) - .First(); - account.AccountType = accountType; - - SubMarket subMarket = db.SubMarkets - .Where(a => a.SubMarketCode == account.SubMarket.SubMarketCode) - .First(); - - account.SubMarket = subMarket; - account.AccountType = ResolveAccountType(db, account.AccountType.AccountTypeCode); - account.SubMarket = ResolveSubmarket(db, account.SubMarket.SubMarketCode); - _ = MetaDataSetter.ForImport(account, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportAccountsFromCSV)"); - } + //Eingelesenen Account in DB schreiben: + using (GremlinContext db = new()) + { + foreach (Account account in accountsReadFromFile) + { + // AccountType aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. + AccountType accountType = db.AccountTypes + .First(a => a.AccountTypeCode == account.AccountType.AccountTypeCode); + account.AccountType = accountType; - db.Accounts.AddRange(AccountsReadFromFile); - _ = db.SaveChanges(); + SubMarket subMarket = db.SubMarkets + .First(a => a.SubMarketCode == account.SubMarket.SubMarketCode); + + account.SubMarket = subMarket; + account.AccountType = ResolveAccountType(db, account.AccountType.AccountTypeCode); + account.SubMarket = ResolveSubmarket(db, account.SubMarket.SubMarketCode); + _ = MetaDataSetter.ForImport(account, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportAccountsFromCSV)"); } - //Eingelesenen Contacts in DB schreiben: - using (GremlinContext db = new()) + db.Accounts.AddRange(accountsReadFromFile); + _ = db.SaveChanges(); + } + + //Eingelesenen Contacts in DB schreiben: + using (GremlinContext db = new()) + { + foreach (Contact contact in contactsReadFromFile) { - DateTime now = DateTime.Now; + contact.Account = ResolveAccountById(db, uint.Parse(contact.Notes)); + contact.Notes = ""; + _ = MetaDataSetter.ForImport(contact, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportContactsFromCSV)"); + } - foreach (Contact contact in ContactsReadFromFile) - { - contact.Account = ResolveAccountById(db, uint.Parse(contact.Notes)); - contact.Notes = ""; - _ = MetaDataSetter.ForImport(contact, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportContactsFromCSV)"); - } + db.Contacts.AddRange(contactsReadFromFile); + _ = db.SaveChanges(); + } - db.Contacts.AddRange(ContactsReadFromFile); - _ = db.SaveChanges(); - } - }; return true; } - public static bool ImportProductsFromCsv(string filepath = "", string separator = "|", bool dataHasHeading = true) - ///Rückgabe 'false' bei Fehler oder User-Abbruch, ansonsten 'true'. - /// - ///Optionale Argumente: - /// 1. string filepath: Dateipfad zur einzulesenden Datei. Standardwert = "", öffnet OpenFile-Dialog. - /// 2. string separator: Trennzeichen, Standardwert = ";" - /// 3. bool dataHasheadings: true = CSV-Datei enthält Überschriften, false = CSV-Datei enthält keine Überschriften, Standardwert = true + private static bool ImportProductsFromCsv(string filepath = "", string separator = "|", bool dataHasHeading = true) { if (filepath == "") { @@ -1177,13 +1116,11 @@ namespace Gremlin_BlazorServer.Data.DBClasses return false; //Wenn keine Datei ausgewählt (Cancel geklickt), dann Abbruch. } - List ProductsReadFromFile = new(ParseProductFile(filepath, separator, dataHasHeading)); - return InsertProducts(ProductsReadFromFile); + List productsReadFromFile = new(ParseProductFile(filepath, separator, dataHasHeading)); + return InsertProducts(productsReadFromFile); } - public static bool ImportCustomDescriptionsFromCsv(string filepath = "", string separator = "|", bool dataHasHeading = true) - ///Importiert Eigene Beschreibungen aus Word-Dokument - ///Abkürzung: CD = CustomDescriptions + private static bool ImportCustomDescriptionsFromCsv(string filepath = "", string separator = "|", bool dataHasHeading = true) { if (filepath == "") { @@ -1195,121 +1132,110 @@ namespace Gremlin_BlazorServer.Data.DBClasses return false; //Wenn keine Datei ausgewählt (Cancel geklickt), dann Abbruch: } - List CDsReadFromFile = new(2500); - using (TextFieldParser csvParser = new(filepath, Encoding.GetEncoding("UTF-8"))) - { - //Parser configuration: - csvParser.Delimiters = new string[] { separator }; - csvParser.CommentTokens = new string[] { "#" }; - csvParser.HasFieldsEnclosedInQuotes = true; + List cDsReadFromFile = new(2500); + using TextFieldParser csvParser = new(filepath, Encoding.GetEncoding("UTF-8")); + //Parser configuration: + csvParser.Delimiters = new[] { separator }; + csvParser.CommentTokens = new[] { "#" }; + csvParser.HasFieldsEnclosedInQuotes = true; - // Skip the row with the column names: - if (dataHasHeading) - { - _ = csvParser.ReadLine(); - } + // Skip the row with the column names: + if (dataHasHeading) + { + _ = csvParser.ReadLine(); + } - while (!csvParser.EndOfData) + while (!csvParser.EndOfData) + { + // Read current line fields, pointer moves to the next line. + string[] fields = csvParser.ReadFields()!; + //string productNumber = fields[0]; + //string? optionNumber = fields[1] == "" ? null : fields[1]; + CustomDescription importedCd = new() { - // Read current line fields, pointer moves to the next line. - string[] fields = csvParser.ReadFields()!; - //string productNumber = fields[0]; - //string? optionNumber = fields[1] == "" ? null : fields[1]; - CustomDescription ImportedCD = new() + ProductNumber = fields[0], + OptionNumber = fields[1], + Heading = fields[3], + DescriptionText = fields[4], + CoverletterText = fields[5], + Notes = fields[6], + Products = new List(), + Supplier = new() { - ProductNumber = fields[0], - OptionNumber = fields[1], - Heading = fields[3], - DescriptionText = fields[4], - CoverletterText = fields[5], - Notes = fields[6], - Products = new List(), - Supplier = new() - { - AccountName = fields[2] is "" or "RB" ? "Agilent Technologies" : fields[2] - } - }; - _ = MetaDataSetter.ForImport(ImportedCD, "Importer", "Initial Importer by CD-ImporterFomCsv"); + AccountName = fields[2] is "" or "RB" ? "Agilent Technologies" : fields[2] + } + }; + _ = MetaDataSetter.ForImport(importedCd, "Importer", "Initial Importer by CD-ImporterFomCsv"); - CDsReadFromFile.Add(ImportedCD); - } + cDsReadFromFile.Add(importedCd); + } - //Eingelesenen Custum Desciptions in DB schreiben: - //Check for 3PPs that not yet in the db. - //Step 1a: Add 3PP-Products from CD-List to list - //Step 1b: Add list to db. - //Step 2: Add CDs to products. + //Eingelesenen Custum Desciptions in DB schreiben: + //Check for 3PPs that not yet in the db. + //Step 1a: Add 3PP-Products from CD-List to list + //Step 1b: Add list to db. + //Step 2: Add CDs to products. - using (GremlinContext db = new()) + using GremlinContext db = new(); + //Step 1a + List thirdPartyProductsFromImportedCDs = new(); + foreach (CustomDescription cd in cDsReadFromFile) + { + if (cd.Supplier.AccountName != "Agilent Technologies") { - //Step 1a - List thirdPartyProductsFromImportedCDs = new(); - foreach (CustomDescription CD in CDsReadFromFile) + Product new3PpProduct = new() { - if (CD.Supplier.AccountName != "Agilent Technologies") - { - Product new3PPProduct = new() - { - CustomDescription = CD, - HasBreakPrices = false, - ListPrice = 0, - ProductNumber = CD.ProductNumber, - OptionNumber = CD.OptionNumber, - ProductStatus = Status.Active.ToString(), - SapLongDescription = "", - SapShortDescription = "", - Weight = 0, - IntroductionDate = DateTime.Now.Date, - BreakRangeFrom = 0, - BreakRangeTo = 0, - ProductLine = ResolveProductLine(db, "3P") - }; - new3PPProduct.CustomDescription.Supplier = ResolveAccountByName(db, new3PPProduct.CustomDescription.Supplier.AccountName); - _ = MetaDataSetter.ForImport(new3PPProduct, "Custom Desciption Importer", "Created at import from Custom Descriptions."); - - thirdPartyProductsFromImportedCDs.Add(new3PPProduct); - } + CustomDescription = cd, + HasBreakPrices = false, + ListPrice = 0, + ProductNumber = cd.ProductNumber, + OptionNumber = cd.OptionNumber, + ProductStatus = Status.Active.ToString(), + SapLongDescription = "", + SapShortDescription = "", + Weight = 0, + IntroductionDate = DateTime.Now.Date, + BreakRangeFrom = 0, + BreakRangeTo = 0, + ProductLine = ResolveProductLine(db, "3P") }; + new3PpProduct.CustomDescription.Supplier = ResolveAccountByName(db, new3PpProduct.CustomDescription.Supplier.AccountName); + _ = MetaDataSetter.ForImport(new3PpProduct, "Custom Desciption Importer", "Created at import from Custom Descriptions."); - //Step 1b - db.Products.AddRange(thirdPartyProductsFromImportedCDs); //Imports both the products and the associated custom descriptions! - _ = db.SaveChanges(); - - // Produkt aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. - //Step 2 - List importedCDsWithEFReferences = new(100000); - List CDsWithoutEFReferences = new(1000); //nur zur Kontrolle, wird nicht verwendet. - List productsInDb = db.Products.ToList(); - Account agilent = db.Accounts.Where(a => a.AccountName == "Agilent Technologies").Single(); - foreach (CustomDescription CD in CDsReadFromFile) - { - if (CD.Products == null) { continue; } - - //Skip Desciptions, if it has been already imported above (as part from 3PP) - if (thirdPartyProductsFromImportedCDs.Intersect(CD.Products).Any()) { continue; } - - //Establish EF Reference. If no PN/Opt found, then skip this custom description. - //CD.Product = GetProduct(db, CD.ProductNumber, CD.OptionNumber); //ResolveXY-functions return null, if no match is found in db. - CD.Products = productsInDb.Where(product => product.ProductNumber == CD.ProductNumber && product.OptionNumber == CD.OptionNumber).ToList(); - if (CD.Products == null) { CDsWithoutEFReferences.Add(CD); continue; } + thirdPartyProductsFromImportedCDs.Add(new3PpProduct); + } + } - //Establish EF Reference: If no Supplier-Account found, then skip this custom description (shouldn't happen), else set Supplier to Agilent (3PP-Supplier have been processed before and their products should not be part of this list). - if (CD.Supplier == null) { CDsWithoutEFReferences.Add(CD); continue; } - CD.Supplier = agilent; - _ = MetaDataSetter.ForImport(CD, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportCustomDescriptionsFromCsv)"); + //Step 1b + db.Products.AddRange(thirdPartyProductsFromImportedCDs); //Imports both the products and the associated custom descriptions! + _ = db.SaveChanges(); + + // Produkt aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. + //Step 2 + List importedCDsWithEfReferences = new(100000); + List cDsWithoutEfReferences = new(1000); //nur zur Kontrolle, wird nicht verwendet. + List productsInDb = db.Products.ToList(); + Account agilent = db.Accounts.Single(a => a.AccountName == "Agilent Technologies"); + foreach (CustomDescription cd in cDsReadFromFile.Where(cd => !thirdPartyProductsFromImportedCDs.Intersect(cd.Products).Any())) + { + //Establish EF Reference. If no PN/Opt found, then skip this custom description. + //CD.Product = GetProduct(db, CD.ProductNumber, CD.OptionNumber); //ResolveXY-functions return null, if no match is found in db. + cd.Products = productsInDb.Where(product => product.ProductNumber == cd.ProductNumber && product.OptionNumber == cd.OptionNumber).ToList(); - //add to final list of CDs, that will go into the db. - importedCDsWithEFReferences.Add(CD); - } + //Establish EF Reference: If no Supplier-Account found, then skip this custom description (shouldn't happen), else set Supplier to Agilent (3PP-Supplier have been processed before and their products should not be part of this list). + cd.Supplier = agilent; + _ = MetaDataSetter.ForImport(cd, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportCustomDescriptionsFromCsv)"); - db.CustomDescriptions.AddRange(importedCDsWithEFReferences); - _ = db.SaveChanges(); - //Bestätigung senden - Debug.WriteLine($"Es wurden {importedCDsWithEFReferences.Count} eigene Beschreibungen erfolgreich der Datenbank hinzugefügt.{Environment.NewLine}Es wurden {thirdPartyProductsFromImportedCDs.Count} 3PP-Produkte neu angelegt."); - } - return true; + //add to final list of CDs, that will go into the db. + importedCDsWithEfReferences.Add(cd); } + + db.CustomDescriptions.AddRange(importedCDsWithEfReferences); + _ = db.SaveChanges(); + //Bestätigung senden + Debug.WriteLine($"Es wurden {importedCDsWithEfReferences.Count} eigene Beschreibungen erfolgreich der Datenbank hinzugefügt.{Environment.NewLine}Es wurden {thirdPartyProductsFromImportedCDs.Count} 3PP-Produkte neu angelegt."); + return true; } //public static bool ImportCustomDescriptionsFromDocx(string filepath = "") @@ -1464,7 +1390,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses // return true; //} - public static bool UpdateProductsFromCsv(string filepath = "", string separator = "|", bool dataHasHeading = true) + private static bool UpdateProductsFromCsv(string filepath = "", string separator = "|", bool dataHasHeading = true) { if (filepath == "") { @@ -1478,129 +1404,125 @@ namespace Gremlin_BlazorServer.Data.DBClasses } //Aktiven Produkte aus DB laden - List ActiveProductsInDb = new(120000); - using (GremlinContext db = new()) - { - //Aktive Produkte aus der DB einlesen - List PLs = db.ProductLines.ToList(); - ActiveProductsInDb = db.Products - .Where(p => p.DataStatus == Status.Active.ToString()) - .Include(p => p.ProductLine) - .ToList(); + using GremlinContext db = new(); + //Aktive Produkte aus der DB einlesen + List activeProductsInDb = db.Products + .Where(p => p.DataStatus == Status.Active.ToString()) + .Include(p => p.ProductLine) + .ToList(); - //Neue CPL einlesen... - List ProductsReadFromFile = new(ParseProductFile(filepath, separator, dataHasHeading)); + //Neue CPL einlesen... + List productsReadFromFile = new(ParseProductFile(filepath, separator, dataHasHeading)); - //...Aufteilung in neue und nicht-neue Produkte... - List NewProducts = new(FilterNewProducts(ProductsReadFromFile)); - List NonNewProducts = new(ProductsReadFromFile.Except(NewProducts)); + //...Aufteilung in neue und nicht-neue Produkte... + List newProducts = new(FilterNewProducts(productsReadFromFile)); + List nonNewProducts = new(productsReadFromFile.Except(newProducts)); - //...Letztere wiederum in obsolete Produkte... - ProductEqualityComparer ProEC = new(); - List ObsoleteProducts = new(ActiveProductsInDb.Except(NonNewProducts, ProEC)); + //...Letztere wiederum in obsolete Produkte... + ProductEqualityComparer proEc = new(); + List obsoleteProducts = new(activeProductsInDb.Except(nonNewProducts, proEc)); - DateTime now = DateTime.Now; + DateTime now = DateTime.Now; - //Obsolete Produkte prozessieren - foreach (Product product in ObsoleteProducts) - { - product.ProductStatus = Status.Obsolete.ToString(); - product.DataStatus = Status.Archived.ToString(); - product.DataValidUntil = now; - product.DataModificationDate = now; - product.DataModificationByUser = "CPL Updater"; - } + //Obsolete Produkte prozessieren + foreach (Product product in obsoleteProducts) + { + product.ProductStatus = Status.Obsolete.ToString(); + product.DataStatus = Status.Archived.ToString(); + product.DataValidUntil = now; + product.DataModificationDate = now; + product.DataModificationByUser = "CPL Updater"; + } - //den Rest prozessieren - List UpdatedProducts = new(10000); - string dataVersionComment = "Data as per " + fileName; + //den Rest prozessieren + List updatedProducts = new(10000); + string dataVersionComment = "Data as per " + fileName; - ////Counter für Debugging - //int x = 0; + ////Counter für Debugging + //int x = 0; - //Multithreading - _ = Parallel.ForEach(NonNewProducts, parallelOptions, (product) => - { - ////Debugging-Counter - //x++; + //Multithreading + _ = Parallel.ForEach(nonNewProducts, parallelOptions, (product) => + { + ////Debugging-Counter + //x++; - Product? ExistingProduct = ActiveProductsInDb - .FirstOrDefault(p => p.ProductNumber == product.ProductNumber - && p.OptionNumber == product.OptionNumber - && p.BreakRangeFrom == product.BreakRangeFrom - && p.BreakRangeTo == product.BreakRangeTo); + Product? existingProduct = activeProductsInDb + .FirstOrDefault(p => p.ProductNumber == product.ProductNumber + && p.OptionNumber == product.OptionNumber + && p.BreakRangeFrom == product.BreakRangeFrom + && p.BreakRangeTo == product.BreakRangeTo); - //Checkpoint, falls ein neues Produkt versehentlich auf "Active" statt auf "New" gesetzt ist. - if (ExistingProduct == null) + //Checkpoint, falls ein neues Produkt versehentlich auf "Active" statt auf "New" gesetzt ist. + if (existingProduct == null) + { + newProducts.Add(product); + return; + } + + //Wenn keine Änderung, dann nur DataVersionComment mit CPL-Dateinamen aktualisieren... + if (product.ListPrice == existingProduct.ListPrice + && product.ProductStatus == existingProduct.ProductStatus + && Normalize(product.SapLongDescription) == Normalize(existingProduct.SapLongDescription) + && Normalize(product.SapShortDescription) == Normalize(existingProduct.SapShortDescription)) + { + existingProduct.DataVersionComment = dataVersionComment; + } + //andernfalls die vorhandene Datensatz-Version archivieren und neue Version anlegen + else //alten Datensatz archivieren: + { + existingProduct.DataStatus = Status.Archived.ToString(); + existingProduct.DataModificationByUser = "CPL Updater"; + existingProduct.DataModificationDate = now; + existingProduct.DataValidUntil = now; + existingProduct.DataVersionComment = "Archived b/c of data update"; + if (product.ListPrice != existingProduct.ListPrice) { - NewProducts.Add(product); - return; + existingProduct.ProductStatus = Status.PriceUpdated.ToString(); } - - //Wenn keine Änderung, dann nur DataVersionComment mit CPL-Dateinamen aktualisieren... - if (product.ListPrice == ExistingProduct.ListPrice - && product.ProductStatus == ExistingProduct.ProductStatus - && Normalize(product.SapLongDescription) == Normalize(ExistingProduct.SapLongDescription) - && Normalize(product.SapShortDescription) == Normalize(ExistingProduct.SapShortDescription)) + else if (Normalize(product.SapLongDescription) != Normalize(existingProduct.SapLongDescription) + || Normalize(product.SapShortDescription) != Normalize(existingProduct.SapShortDescription)) { - ExistingProduct.DataVersionComment = dataVersionComment; + existingProduct.ProductStatus = Status.DescriptionUpdated.ToString(); } - //andernfalls die vorhandene Datensatz-Version archivieren und neue Version anlegen - else //alten Datensatz archivieren: + else if (product.ProductStatus == existingProduct.ProductStatus) { - ExistingProduct.DataStatus = Status.Archived.ToString(); - ExistingProduct.DataModificationByUser = "CPL Updater"; - ExistingProduct.DataModificationDate = now; - ExistingProduct.DataValidUntil = now; - ExistingProduct.DataVersionComment = "Archived b/c of data update"; - if (product.ListPrice != ExistingProduct.ListPrice) - { - ExistingProduct.ProductStatus = Status.PriceUpdated.ToString(); - } - else if (Normalize(product.SapLongDescription) != Normalize(ExistingProduct.SapLongDescription) - || Normalize(product.SapShortDescription) != Normalize(ExistingProduct.SapShortDescription)) - { - ExistingProduct.ProductStatus = Status.DescriptionUpdated.ToString(); - } - else if (product.ProductStatus == ExistingProduct.ProductStatus) - { - ExistingProduct.ProductStatus = Status.StatusUpdated.ToString(); - } + existingProduct.ProductStatus = Status.StatusUpdated.ToString(); + } - //neuen Datensatz anlegen - Product UpdatedProduct = new() - { - ProductNumber = product.ProductNumber, - OptionNumber = product.OptionNumber, - BreakRangeFrom = product.BreakRangeFrom, - BreakRangeTo = product.BreakRangeTo, - HasBreakPrices = product.HasBreakPrices, - IntroductionDate = ExistingProduct.IntroductionDate, - ListPrice = product.ListPrice, - ProductStatus = Status.Active.ToString(), - SapLongDescription = product.SapLongDescription, - SapShortDescription = product.SapShortDescription, - Weight = product.Weight, - }; - _ = MetaDataSetter.ForImport(UpdatedProduct, "CPL Updater", "Product Update"); - - - UpdatedProduct.ProductLine = product.ProductLine.ProductLineCode == ExistingProduct.ProductLine.ProductLineCode - ? product.ProductLine - : ResolveProductLine(db, product.ProductLine.ProductLineCode); - - NewProducts.Add(UpdatedProduct); - } - UpdatedProducts.Add(ExistingProduct); - }); - - _ = InsertProducts(NewProducts); //enthält auch ResolvePL() - db.Products.UpdateRange(ObsoleteProducts); - db.Products.UpdateRange(UpdatedProducts); - int changes = db.SaveChanges(); - Debug.WriteLine($"Es wurden {changes} Änderungen an der Datenbank durchgeführt.\n Davon waren {UpdatedProducts.Count} UpdatedProducts, {ObsoleteProducts.Count} ObsoleteProducts und {NewProducts.Count} NewProducts"); - } + //neuen Datensatz anlegen + Product updatedProduct = new() + { + ProductNumber = product.ProductNumber, + OptionNumber = product.OptionNumber, + BreakRangeFrom = product.BreakRangeFrom, + BreakRangeTo = product.BreakRangeTo, + HasBreakPrices = product.HasBreakPrices, + IntroductionDate = existingProduct.IntroductionDate, + ListPrice = product.ListPrice, + ProductStatus = Status.Active.ToString(), + SapLongDescription = product.SapLongDescription, + SapShortDescription = product.SapShortDescription, + Weight = product.Weight, + }; + _ = MetaDataSetter.ForImport(updatedProduct, "CPL Updater", "Product Update"); + + + updatedProduct.ProductLine = product.ProductLine.ProductLineCode == existingProduct.ProductLine.ProductLineCode + ? product.ProductLine + : ResolveProductLine(db, product.ProductLine.ProductLineCode); + + newProducts.Add(updatedProduct); + } + updatedProducts.Add(existingProduct); + }); + + _ = InsertProducts(newProducts); //enthält auch ResolvePL() + db.Products.UpdateRange(obsoleteProducts); + db.Products.UpdateRange(updatedProducts); + int changes = db.SaveChanges(); + Debug.WriteLine($"Es wurden {changes} Änderungen an der Datenbank durchgeführt.\n Davon waren {updatedProducts.Count} UpdatedProducts, {obsoleteProducts.Count} ObsoleteProducts und {newProducts.Count} NewProducts"); return true; } @@ -1731,159 +1653,139 @@ namespace Gremlin_BlazorServer.Data.DBClasses case "productlinedescription": result.Add("ProductLineDescription", i); break; - default: - break; } } return result; } private static List ParseProductFile(string filepath, string separator, bool dataHasHeading) - ///Importiert Produkt-Daten aus CSV (erstellt aus PriceSurfer-CPL) - /// - Encoding: Latin1 - /// - Separator = ; - /// - fixe Spaltenzahl und -folge (Überschriften werden nicht untersucht/verwendet): - /// 1) Position = ID/PK - /// 2) Partnumber - /// 3) Option - /// 4) (Short) Description - /// 5) Current Month Price (EUR) - /// 6) ProductLineID - /// 7) Status - /// 8) (Long) Description - ///Kommentarzeichen: # (hardcoded, string array) { List results = new(100000); //ENCODING CHANGED TO ISO-8859-1 AS EQUIVALENT (?) TO "LATIN1" (unavailable). TO BE TESTED! - using (TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath))) + using TextFieldParser csvParser = new(filepath, FileService.GetEncoding(filepath)); + //Parser configuration: + csvParser.Delimiters = new[] { separator }; + csvParser.CommentTokens = new[] { "#" }; + csvParser.HasFieldsEnclosedInQuotes = true; + + // Skip the row with the column names: + if (dataHasHeading) { - //Parser configuration: - csvParser.Delimiters = new string[] { separator }; - csvParser.CommentTokens = new string[] { "#" }; - csvParser.HasFieldsEnclosedInQuotes = true; + _ = csvParser.ReadLine(); + } - // Skip the row with the column names: - if (dataHasHeading) + //decimal oldListPrice; + //bool listpriceHasChanged; + while (!csvParser.EndOfData) + { + // Read current line fields, pointer moves to the next line. + Product importedProduct = new() { - _ = csvParser.ReadLine(); - } + ProductLine = new() + }; + string[] fields = csvParser.ReadFields() ?? new string[1]; - //decimal oldListPrice; - //bool listpriceHasChanged; - while (!csvParser.EndOfData) + //Kontrolle, ob Trennzeichen in Daten vorhanden ist: + if (fields.Length > 27) //27 ist der Normalfall { - // Read current line fields, pointer moves to the next line. - Product ImportedProduct = new() + //Sonderfall "EnVisionTM G|2": + //suche fields[x], das auf " G" endet und auf das field[x+1] mit "2 " beginnt, kombiniere die beiden und schiebe alle darauffolgenden Felder in diesem Datensatz eins nach links. + for (int i = 0; i < fields.Length - 1; i++) //fields.Length - 1, um durch i+1 nicht aus dem Index zu laufen { - ProductLine = new() - }; - string[] fields = csvParser.ReadFields() ?? new string[1]; - - //Kontrolle, ob Trennzeichen in Daten vorhanden ist: - if (fields.Length > 27) //27 ist der Normalfall - { - //Sonderfall "EnVisionTM G|2": - //suche fields[x], das auf " G" endet und auf das field[x+1] mit "2 " beginnt, kombiniere die beiden und schiebe alle darauffolgenden Felder in diesem Datensatz eins nach links. - for (int i = 0; i < fields.Length - 1; i++) //fields.Length - 1, um durch i+1 nicht aus dem Index zu laufen + if (fields[i].EndsWith(" G")) { - if (fields[i].EndsWith(" G")) + if (fields[i + 1].StartsWith("2 ")) { - if (fields[i + 1].StartsWith("2 ")) + fields[i] = fields[i] + fields[i + 1]; + for (int j = i + 2; j < fields.Length; j++) { - fields[i] = fields[i] + fields[i + 1]; - for (int j = i + 2; j < fields.Length; j++) - { - fields[j - 1] = fields[j]; - } + fields[j - 1] = fields[j]; } } } } + } - //NICHT ausgewertete Felder: - //fields[0] = Position [in CPL] - //fields[8] = Warranty - //fields[10] = PH Code - //fields[11] = PH Description - //fields[15] = Country of Manufacturing - //fields[16] = ECCL - //fields[17] = M41 - //fields[18] = First Supplier Code - //fields[19] = Harmonized Tarif Schedule - //fields[20] = Hazardous Good Flag - //fields[21] = Order instructions - //fields[23] = End of Production Date - //fields[24] = End of Support Date - - ImportedProduct.ProductNumber = fields[1]; - - if (fields[2].Length == 4) //Optionsnummer mit führendem Apostroph - { - ImportedProduct.OptionNumber = fields[2].Substring(1); //schneidet erstes Zeichen/Apostroph weg - } - else if (fields[2].Length == 3) //3-stellige Optionsnummer übernehmen; keine Aktion bei leerem Feld (keine Optionsnummer) - { - ImportedProduct.OptionNumber = fields[2]; - } + //NICHT ausgewertete Felder: + //fields[0] = Position [in CPL] + //fields[8] = Warranty + //fields[10] = PH Code + //fields[11] = PH Description + //fields[15] = Country of Manufacturing + //fields[16] = ECCL + //fields[17] = M41 + //fields[18] = First Supplier Code + //fields[19] = Harmonized Tarif Schedule + //fields[20] = Hazardous Good Flag + //fields[21] = Order instructions + //fields[23] = End of Production Date + //fields[24] = End of Support Date + + importedProduct.ProductNumber = fields[1]; + + if (fields[2].Length == 4) //Optionsnummer mit führendem Apostroph + { + importedProduct.OptionNumber = fields[2].Substring(1); //schneidet erstes Zeichen/Apostroph weg + } + else if (fields[2].Length == 3) //3-stellige Optionsnummer übernehmen; keine Aktion bei leerem Feld (keine Optionsnummer) + { + importedProduct.OptionNumber = fields[2]; + } - ImportedProduct.SapShortDescription = fields[3]; + importedProduct.SapShortDescription = fields[3]; - ImportedProduct.ListPrice = decimal.Parse(fields[4], new CultureInfo("de-de")); //parsing! compare with old value (either from CSV or from DB) -> price change? + importedProduct.ListPrice = decimal.Parse(fields[4], new CultureInfo("de-de")); //parsing! compare with old value (either from CSV or from DB) -> price change? - //if (fields[5] != "") - // if (decimal.Parse(fields[5], new CultureInfo("de-de")) != ImportedProduct.ListPrice) - // listpriceHasChanged = true; + //if (fields[5] != "") + // if (decimal.Parse(fields[5], new CultureInfo("de-de")) != ImportedProduct.ListPrice) + // listpriceHasChanged = true; - ImportedProduct.BreakRangeFrom = fields[6] == "" ? 0 : Convert.ToInt32(fields[6]); - ImportedProduct.HasBreakPrices = ImportedProduct.BreakRangeFrom > 0; - ImportedProduct.BreakRangeTo = fields[7] is "" or "+" ? 0 : Convert.ToInt32(fields[7]); //erfasst sowohl Produkte ohne Break-Preise ("") als auch "+" bei Mengenangaben a la "100+" (= von 100 bis unendlich) + importedProduct.BreakRangeFrom = fields[6] == "" ? 0 : Convert.ToInt32(fields[6]); + importedProduct.HasBreakPrices = importedProduct.BreakRangeFrom > 0; + importedProduct.BreakRangeTo = fields[7] is "" or "+" ? 0 : Convert.ToInt32(fields[7]); //erfasst sowohl Produkte ohne Break-Preise ("") als auch "+" bei Mengenangaben a la "100+" (= von 100 bis unendlich) - ImportedProduct.ProductLine.ProductLineCode = fields[9]; + importedProduct.ProductLine.ProductLineCode = fields[9]; - switch (fields[12]) - { - case "Active": - ImportedProduct.DataStatus = Status.Active.ToString(); - ImportedProduct.ProductStatus = Status.Active.ToString(); - break; - case "New Product" or "New": - ImportedProduct.DataStatus = Status.Active.ToString(); - ImportedProduct.ProductStatus = Status.New.ToString(); - break; - case "Price Changed": - ImportedProduct.DataStatus = Status.Active.ToString(); - ImportedProduct.ProductStatus = Status.PriceUpdated.ToString(); - break; - default: - ImportedProduct.DataStatus = Status.StatusUpdated.ToString(); - break; - } + switch (fields[12]) + { + case "Active": + importedProduct.DataStatus = Status.Active.ToString(); + importedProduct.ProductStatus = Status.Active.ToString(); + break; + case "New Product" or "New": + importedProduct.DataStatus = Status.Active.ToString(); + importedProduct.ProductStatus = Status.New.ToString(); + break; + case "Price Changed": + importedProduct.DataStatus = Status.Active.ToString(); + importedProduct.ProductStatus = Status.PriceUpdated.ToString(); + break; + default: + importedProduct.DataStatus = Status.StatusUpdated.ToString(); + break; + } - if (fields[14] != null) - { - ImportedProduct.Weight = ParseWeight(fields[14]); - } + importedProduct.Weight = ParseWeight(fields[14]); - if (fields[13] == "G") - { - ImportedProduct.Weight /= 1000; //Umrechnung g in kg - } + if (fields[13] == "G") + { + importedProduct.Weight /= 1000; //Umrechnung g in kg + } - if (fields[22] != "") - { - ImportedProduct.IntroductionDate = DateTime.Parse(fields[22]); - } + if (fields[22] != "") + { + importedProduct.IntroductionDate = DateTime.Parse(fields[22]); + } - ImportedProduct.SapLongDescription = fields[25]; + importedProduct.SapLongDescription = fields[25]; - results.Add(ImportedProduct); - } + results.Add(importedProduct); } return results; } - public static float ParseWeight(string input) + private static float ParseWeight(string input) { StringBuilder sb = new(); if (input.StartsWith(".")) @@ -1903,25 +1805,22 @@ namespace Gremlin_BlazorServer.Data.DBClasses } - public static bool InsertProducts(List products) + private static bool InsertProducts(List products) { - using (GremlinContext db = new()) + using GremlinContext db = new(); + List productLines = db.ProductLines.ToList(); + foreach (Product product in products) { - DateTime now = DateTime.Now; - List productLines = db.ProductLines.ToList(); - foreach (Product product in products) - { - product.ProductLine = productLines.Find(x => x.ProductLineCode == product.ProductLine.ProductLineCode) ?? new ProductLine(); - _ = MetaDataSetter.ForImport(product, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportProductsFromCSV)"); - } - - db.Products.AddRange(products); - _ = db.SaveChanges(); - //Bestätigung senden - // Debug.WriteLine($"Es wurden {products.Count} Produkte erfolgreich der Datenbank hinzugefügt."); - Debug.WriteLine($"Es wurden {products.Count} Produkte erfolgreich der Datenbank hinzugefügt."); - return true; + product.ProductLine = productLines.Find(x => x.ProductLineCode == product.ProductLine.ProductLineCode) ?? new ProductLine(); + _ = MetaDataSetter.ForImport(product, "CSVImporter", "Initial import by CSV Importer (Function DbHelper.ImportProductsFromCSV)"); } + + db.Products.AddRange(products); + _ = db.SaveChanges(); + //Bestätigung senden + // Debug.WriteLine($"Es wurden {products.Count} Produkte erfolgreich der Datenbank hinzugefügt."); + Debug.WriteLine($"Es wurden {products.Count} Produkte erfolgreich der Datenbank hinzugefügt."); + return true; } public static void DisplayErrorDetails(Exception ex, string errorRaiser) @@ -1931,11 +1830,11 @@ namespace Gremlin_BlazorServer.Data.DBClasses // Debug.WriteLine(errorMessage); } - internal static string ExtractFileName(string filepath, bool withExtension = false) + private static string ExtractFileName(string filepath, bool withExtension = false) { string[] fields = filepath.Split(@"\"); - string[] filename = fields[fields.Length - 1].Split("."); - return withExtension ? fields[fields.Length - 1] : filename[0]; + string[] filename = fields[^1].Split("."); + return withExtension ? fields[^1] : filename[0]; } private static string Normalize(string input) @@ -1983,7 +1882,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses // return results; //} - public static async Task ImportLSAGContactListToolDataAsync() => await Task.Run(() => ImportLSAGContactListToolData()); + public static async Task ImportLsagContactListToolDataAsync() => await Task.Run(() => ImportLsagContactListToolData()); public static async Task ImportAccountsFromCsvAsync() => await Task.Run(() => ImportAccountsFromCsv()); @@ -1999,52 +1898,52 @@ namespace Gremlin_BlazorServer.Data.DBClasses public static Account ResolveAccountByName(GremlinContext context, string accountName) { - try { return context.Accounts.Include(account => account.AccountType).Include(account => account.SubMarket).Where(account => account.AccountName == accountName).First(); } + try { return context.Accounts.Include(account => account.AccountType).Include(account => account.SubMarket).First(account => account.AccountName == accountName); } catch { return new Account(); } } public static Account ResolveAccountById(GremlinContext context, uint accountId) { - try { return context.Accounts.Where(account => account.SAPAccountNumber == accountId).First(); } + try { return context.Accounts.First(account => account.SapAccountNumber == accountId); } catch { return new Account(); } } public static Account ResolveAccountById(GremlinContext context, string accountId) { - try { return context.Accounts.Where(account => account.SAPAccountNumber == Convert.ToUInt32(accountId)).First(); } + try { return context.Accounts.First(account => account.SapAccountNumber == Convert.ToUInt32(accountId)); } catch { return new Account(); } } public static AccountType ResolveAccountType(GremlinContext context, string accountTypeCode) { - try { return context.AccountTypes.Where(account => account.AccountTypeCode == accountTypeCode).First(); } + try { return context.AccountTypes.First(account => account.AccountTypeCode == accountTypeCode); } catch { return new AccountType(); } } public static SubMarket ResolveSubmarket(GremlinContext context, string subMarketCode) { - try { return context.SubMarkets.Where(submarket => submarket.SubMarketCode == subMarketCode).First(); } + try { return context.SubMarkets.First(submarket => submarket.SubMarketCode == subMarketCode); } catch { return new SubMarket(); } } public static Product GetProduct(GremlinContext context, string productNumber, string optionNumber) { - try { return context.Products.Include(product => product.ProductLine).Include(product => product.CustomDescription).Where(product => product.ProductNumber == productNumber && product.OptionNumber == optionNumber).First(); } + try { return context.Products.Include(product => product.ProductLine).Include(product => product.CustomDescription).First(product => product.ProductNumber == productNumber && product.OptionNumber == optionNumber); } catch { return new Product(); } } public static Product ResolveProduct(GremlinContext context, string productNumber, string option) { - try { return context.Products.Where(product => product.ProductNumber == productNumber && product.OptionNumber == option).First(); } + try { return context.Products.First(product => product.ProductNumber == productNumber && product.OptionNumber == option); } catch { return new Product(); } } public static ProductLine ResolveProductLine(GremlinContext context, string productLineCode) { - try { return context.ProductLines.Where(productline => productline.ProductLineCode == productLineCode).First(); } + try { return context.ProductLines.First(productline => productline.ProductLineCode == productLineCode); } catch { return new ProductLine(); } } - public static string RandomString(int length) + private static string RandomString(int length) { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); @@ -2052,13 +1951,13 @@ namespace Gremlin_BlazorServer.Data.DBClasses public static Contact GetContact(GremlinContext context, string lastName) { - try { return context.Contacts.Where(contact => contact.LastName == lastName).First(); } + try { return context.Contacts.First(contact => contact.LastName == lastName); } catch { return new Contact(); } } public static Contact GetContact(GremlinContext context, uint contactId) { - try { return context.Contacts.Where(contact => contact.ContactId == contactId).First(); } + try { return context.Contacts.First(contact => contact.ContactId == contactId); } catch { return new Contact(); } } diff --git a/Gremlin_BlazorServer/Data/DBClasses/Encryption.cs b/Gremlin_BlazorServer/Data/DBClasses/Encryption.cs index e3ec587..e4b3d5b 100644 --- a/Gremlin_BlazorServer/Data/DBClasses/Encryption.cs +++ b/Gremlin_BlazorServer/Data/DBClasses/Encryption.cs @@ -44,7 +44,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses public static string ToInsecureString(SecureString input) { - string returnValue = string.Empty; + string returnValue; IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(input); try { diff --git a/Gremlin_BlazorServer/Data/DBClasses/EntityConfiguration.cs b/Gremlin_BlazorServer/Data/DBClasses/EntityConfiguration.cs index ac75369..ad33e38 100644 --- a/Gremlin_BlazorServer/Data/DBClasses/EntityConfiguration.cs +++ b/Gremlin_BlazorServer/Data/DBClasses/EntityConfiguration.cs @@ -9,38 +9,38 @@ namespace Gremlin_BlazorServer.Data.DBClasses public void Configure(EntityTypeBuilder accountEntity) { _ = accountEntity.HasKey(e => e.AccountId); - _ = accountEntity.HasMany(d => d.Contacts).WithOne(p => p.Account).IsRequired(true); - _ = accountEntity.HasOne(d => d.AccountType).WithMany(p => p.Accounts).IsRequired(true).OnDelete(DeleteBehavior.Restrict); - _ = accountEntity.HasOne(d => d.SubMarket).WithMany(p => p.Accounts).IsRequired(true).OnDelete(DeleteBehavior.Restrict); - _ = accountEntity.HasAlternateKey(e => e.SAPAccountNumber); // =Unique + _ = 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(true).HasMaxLength(250); + _ = accountEntity.Property(e => e.AccountName).IsRequired().HasMaxLength(250); _ = accountEntity.Property(e => e.Notes).HasDefaultValue(""); - _ = accountEntity.Property(e => e.Street).IsRequired(true).HasMaxLength(100); - _ = accountEntity.Property(e => e.ZIP).IsRequired(true).HasColumnType("Char(5)"); - _ = accountEntity.Property(e => e.City).IsRequired(true).HasMaxLength(50); + _ = 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(true).HasMaxLength(30); + _ = 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(true); - _ = accountEntity.Property(e => e.AccountCreatedInSAPOn).IsRequired(true); + _ = 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(true); + _ = accountEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = accountEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = accountEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); + _ = 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(true); + _ = 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(true).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()"); } } @@ -49,14 +49,14 @@ namespace Gremlin_BlazorServer.Data.DBClasses public void Configure(EntityTypeBuilder contactEntity) { _ = contactEntity.HasKey(e => e.ContactId); - _ = contactEntity.HasOne(p => p.Account).WithMany(d => d.Contacts).IsRequired(true); + _ = contactEntity.HasOne(p => p.Account).WithMany(d => d.Contacts).IsRequired(); //entity.HasAlternateKey(e => e.SAPContactNumber); _ = contactEntity.Property(e => e.ContactId); - _ = contactEntity.Property(e => e.SAPContactNumber).IsRequired(true); + _ = contactEntity.Property(e => e.SapContactNumber).IsRequired(); _ = contactEntity.Property(e => e.AcademicTitle).HasDefaultValue(""); _ = contactEntity.Property(e => e.FirstName).HasDefaultValue(""); - _ = contactEntity.Property(e => e.LastName).IsRequired(true); + _ = 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); @@ -67,13 +67,13 @@ namespace Gremlin_BlazorServer.Data.DBClasses _ = 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(true); + _ = contactEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = contactEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = contactEntity.Property(e => e.DataStatus).IsRequired(true); + _ = 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(true); + _ = 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(true).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()"); } } @@ -84,30 +84,30 @@ namespace Gremlin_BlazorServer.Data.DBClasses _ = 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(true).ValueGeneratedOnAdd(); - _ = quoteEntity.Property(e => e.QuotationDate).IsRequired(true).ValueGeneratedOnAdd(); + _ = 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(true); + _ = 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.Vat); _ = quoteEntity.Property(e => e.TotalGross); - _ = quoteEntity.Property(e => e.QuoteContains3PP).HasDefaultValue(false); - _ = quoteEntity.Property(e => e.QuoteContainsRB).HasDefaultValue(false); + _ = 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(true); + _ = quoteEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = quoteEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = quoteEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); ; - _ = quoteEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = quoteEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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()"); } } @@ -116,33 +116,33 @@ namespace Gremlin_BlazorServer.Data.DBClasses public void Configure(EntityTypeBuilder entity) { _ = entity.HasKey(e => e.LineItemId); - _ = entity.HasOne(p => p.Quote).WithMany(d => d.LineItems).HasForeignKey(fk => fk.QuoteId).IsRequired(true).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(true); - _ = entity.Property(e => e.Amount).IsRequired(true); - _ = entity.Property(e => e.ProductNumber).IsRequired(true); + _ = 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(true).HasDefaultValue(0); - _ = entity.Property(e => e.SalesDiscount).IsRequired(true).HasDefaultValue(0); - _ = entity.Property(e => e.PromotionalDiscount).IsRequired(true).HasDefaultValue(0); - _ = entity.Property(e => e.ContractualDiscount).IsRequired(true).HasDefaultValue(0); - _ = entity.Property(e => e.DemoDiscount).IsRequired(true).HasDefaultValue(0); - _ = entity.Property(e => e.ListPrice).IsRequired(true); - _ = entity.Property(e => e.ExtendedListPrice).IsRequired(true); - _ = entity.Property(e => e.NetPrice).IsRequired(true); - _ = entity.Property(e => e.Total).IsRequired(true); + _ = 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(true); + _ = entity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = entity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = entity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); - _ = entity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = entity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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()"); } } @@ -151,28 +151,28 @@ namespace Gremlin_BlazorServer.Data.DBClasses public void Configure(EntityTypeBuilder productEntity) { _ = productEntity.HasKey(e => e.ProductId); - _ = productEntity.HasOne(d => d.CustomDescription).WithMany(p => p.Products).HasForeignKey("CustomDescriptionId").IsRequired(true).OnDelete(DeleteBehavior.SetNull); - _ = productEntity.HasOne(p => p.ProductLine).WithMany(d => d.Products).HasForeignKey("ProductLineCode").IsRequired(true).OnDelete(DeleteBehavior.Restrict); + _ = 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(true); + _ = productEntity.Property(e => e.CustomDescriptionId).IsRequired(); - _ = productEntity.Property(e => e.ProductNumber).IsRequired(true); + _ = 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(true); + _ = 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(true); + _ = productEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = productEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = productEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); - _ = productEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = productEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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()"); } } @@ -182,11 +182,11 @@ namespace Gremlin_BlazorServer.Data.DBClasses { _ = 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(true); + _ = customDescriptionEntity.HasOne(p => p.Supplier).WithMany(d => d.CustomDescriptions).IsRequired(); - _ = customDescriptionEntity.Property(e => e.ProductNumber).IsRequired(true); + _ = customDescriptionEntity.Property(e => e.ProductNumber).IsRequired(); _ = customDescriptionEntity.Property(e => e.OptionNumber).HasDefaultValue(""); - _ = customDescriptionEntity.Property(e => e.Heading).IsRequired(true); + _ = customDescriptionEntity.Property(e => e.Heading).IsRequired(); _ = customDescriptionEntity.Property(e => e.DescriptionText).HasDefaultValue(""); _ = customDescriptionEntity.Property(e => e.CoverletterText).HasDefaultValue(""); _ = customDescriptionEntity.Property(e => e.Notes).HasDefaultValue(""); @@ -194,11 +194,11 @@ namespace Gremlin_BlazorServer.Data.DBClasses _ = 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(true); + _ = customDescriptionEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = customDescriptionEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = customDescriptionEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); - _ = customDescriptionEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = customDescriptionEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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 +206,18 @@ namespace Gremlin_BlazorServer.Data.DBClasses { public void Configure(EntityTypeBuilder productLineEntity) { - _ = productLineEntity.HasMany(p => p.Products).WithOne(d => d.ProductLine).IsRequired(true).OnDelete(DeleteBehavior.Restrict); + _ = productLineEntity.HasMany(p => p.Products).WithOne(d => d.ProductLine).IsRequired().OnDelete(DeleteBehavior.Restrict); - _ = productLineEntity.Property(e => e.ProductLineDescription).IsRequired(true); + _ = 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(true); + _ = productLineEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = productLineEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = productLineEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); - _ = productLineEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = productLineEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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 +227,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(true).HasColumnType("Char(3)"); - _ = accountTypeEntity.Property(e => e.AccountTypeDescription).HasColumnType("Varchar(1000)").IsRequired(true); + _ = 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(true); + _ = accountTypeEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = accountTypeEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = accountTypeEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); - _ = accountTypeEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = accountTypeEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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()"); } } @@ -248,16 +248,16 @@ 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(true); + _ = 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(true); + _ = subMarketEntity.Property(e => e.DataVersionNumber).HasDefaultValue(1).IsRequired(); _ = subMarketEntity.Property(e => e.DataVersionComment).HasDefaultValue(""); - _ = subMarketEntity.Property(e => e.DataStatus).IsRequired(true).HasDefaultValue("Active"); - _ = subMarketEntity.Property(e => e.DataModificationDate).HasColumnType("TIMESTAMP").HasDefaultValueSql("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").ValueGeneratedOnAddOrUpdate().IsConcurrencyToken(true); - _ = subMarketEntity.Property(e => e.DataModificationByUser).HasColumnType("TINYTEXT").IsRequired(true).HasDefaultValueSql("ON INSERT CURRENT_USER() ON UPDATE CURRENT_USER()"); + _ = 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,30 +265,30 @@ namespace Gremlin_BlazorServer.Data.DBClasses { public void Configure(EntityTypeBuilder registeredUserEntity) { - _ = registeredUserEntity.HasKey(e => e.RegisteredUserID); + _ = registeredUserEntity.HasKey(e => e.RegisteredUserId); - _ = registeredUserEntity.HasMany(d => d.RUSettings).WithOne(p => p.RegisteredUser).IsRequired(true); - _ = registeredUserEntity.Property(e => e.UserName).IsRequired(true); - _ = registeredUserEntity.Property(e => e.PasswordHash).IsRequired(true); + _ = 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(true); + _ = 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()"); } } - public class RUSettingsConfiguration : IEntityTypeConfiguration + public class RuSettingsConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder rUSettingsEntitity) + public void Configure(EntityTypeBuilder rUSettingsEntitity) { - _ = rUSettingsEntitity.HasKey(e => e.RUSettingsID); + _ = rUSettingsEntitity.HasKey(e => e.RuSettingsId); - _ = rUSettingsEntitity.HasOne(d => d.RegisteredUser).WithMany(p => p.RUSettings).IsRequired(true); - _ = rUSettingsEntitity.Property(e => e.SettingKey).IsRequired(true); - _ = rUSettingsEntitity.Property(e => e.SettingValue).IsRequired(true); + _ = 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(true); + _ = 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()"); } } diff --git a/Gremlin_BlazorServer/Data/DBClasses/GenericImporter.cs b/Gremlin_BlazorServer/Data/DBClasses/GenericImporter.cs index 644ca8b..dda64dc 100644 --- a/Gremlin_BlazorServer/Data/DBClasses/GenericImporter.cs +++ b/Gremlin_BlazorServer/Data/DBClasses/GenericImporter.cs @@ -14,47 +14,32 @@ namespace Gremlin_BlazorServer.Data.DBClasses //Private members private static readonly DateTime FarInTheFuture = DateTime.Parse("2050-12-31t00:00:00.000000z", CultureInfo.CurrentCulture); - private static Encoding encoding = Encoding.UTF8; - private static TextFieldParser csvParser = new(Filepath, encoding, true); - private static string filepath = string.Empty; - internal static GremlinContext db = new(); + private static Encoding _encoding = Encoding.UTF8; + private static TextFieldParser _csvParser = new(Filepath, _encoding, true); + private static readonly GremlinContext Db = new(); //Public properties - public static string Filepath - { - get => filepath; - set - { - filepath = value; - if (encoding != null) - { - TextFieldParser _csvParser = new(Filepath, encoding, true); - _csvParser.SetDelimiters(Separators); - _csvParser.HasFieldsEnclosedInQuotes = true; - } - } - } + private static string Filepath { get; set; } = string.Empty; - public static string[] Separators + private static string[] Separators { - get => csvParser.Delimiters!; + get => _csvParser.Delimiters!; set { if (value.Length > 0) { - csvParser.SetDelimiters(value); + _csvParser.SetDelimiters(value); } } } public static bool DataHasHeadings { get; set; } - public static Encoding Encoding + private static Encoding Encoding { - get => encoding; set { - encoding = value; + _encoding = value; ResetParser(); } } @@ -101,34 +86,34 @@ namespace Gremlin_BlazorServer.Data.DBClasses //Public methods - public static void SetFilepath() + private static void SetFilepath() { //Filepath = FileIO.GetFilepathFromUser(); } - public static void ResetParser() + private static void ResetParser() { if (Filepath != "") { - TextFieldParser _newParser = new(Filepath, encoding); - _newParser.SetDelimiters(Separators); - _newParser.HasFieldsEnclosedInQuotes = true; - csvParser = _newParser; + TextFieldParser newParser = new(Filepath, _encoding); + newParser.SetDelimiters(Separators); + newParser.HasFieldsEnclosedInQuotes = true; + _csvParser = newParser; } } public static bool Run(string filepath, string separator, string encoding) { - GenericImporter.filepath = filepath.Replace(@"\\", @"\"); + Filepath = filepath.Replace(@"\\", @"\"); try { Encoding = Encoding.GetEncoding(encoding); } catch (Exception) { - Encoding = FileService.GetEncoding(GenericImporter.filepath); + Encoding = FileService.GetEncoding(Filepath); } - Separators = new string[] { separator }; + Separators = new[] { separator }; return ImportFile(); } @@ -140,16 +125,16 @@ namespace Gremlin_BlazorServer.Data.DBClasses return false; } - GenericImporter.filepath = filepath.Replace(@"\\", @"\"); + Filepath = filepath.Replace(@"\\", @"\"); try { Encoding = Encoding.GetEncoding(encoding); } catch (Exception) { - Encoding = FileService.GetEncoding(GenericImporter.filepath); + Encoding = FileService.GetEncoding(Filepath); } - Separators = new string[] { separator }; + Separators = new[] { separator }; return await Task.Run(ImportFile); } @@ -161,12 +146,12 @@ namespace Gremlin_BlazorServer.Data.DBClasses return string.Empty; } - string[] candidates = new string[] { "|", ",", ";" }; + string[] candidates = new[] { "|", ",", ";" }; int numberOfCandidates = candidates.Length; - int numberOfLinesToEvaluate = 100; + const int numberOfLinesToEvaluate = 100; int[,] score = new int[numberOfLinesToEvaluate, numberOfCandidates]; - GenericImporter.filepath = filepath.Replace(@"\\", @"\"); + Filepath = filepath.Replace(@"\\", @"\"); //if (csvParser == null) //{ // try @@ -179,14 +164,13 @@ namespace Gremlin_BlazorServer.Data.DBClasses // } //} - using (csvParser) + using (_csvParser) { - string line; for (int i = 0; i < numberOfLinesToEvaluate; i++) { - if (!csvParser.EndOfData) + if (!_csvParser.EndOfData) { - line = csvParser.ReadLine()!; + string line = _csvParser.ReadLine()!; for (int j = 0; j < numberOfCandidates; j++) { score[i, j] = line.Split(candidates[j]).Length; @@ -196,12 +180,10 @@ namespace Gremlin_BlazorServer.Data.DBClasses } List<(string, int, float)> scoreBoard = new(); //Item1 = Separator, Item2 = Score (Anzahl aufeinanderfolgender Zeilen mit gleicher Anzahl von Fields), Item3 = Count (durchschnittliche Anzahl von Fields in Zeile) - int x; - float average; for (int j = 0; j < numberOfCandidates; j++) { - x = 0; - average = 0; + int x = 0; + float average = 0; for (int i = 0; i < numberOfLinesToEvaluate - 1; i++) { if (score[i, j] == score[i + 1, j] && score[i, j] > 1) @@ -219,7 +201,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses return scoreBoard.Find(f => f.Item2 == scoreBoard.Max(x => x.Item2) && f.Item3 == scoreBoard.Max(x => x.Item3)).Item1; } - public static bool ImportFile() + private static bool ImportFile() //Ein (möglichst) generischer Importer //1. Dateipfad erfassen //2. Column <-> Property Mapping @@ -227,17 +209,17 @@ namespace Gremlin_BlazorServer.Data.DBClasses //4. Daten einlesen, konvertieren, validieren, Metadaten setzen und alles in Liste(n) speichern //5. Datenliste(n) in DB speichern { - if (filepath == "") + if (Filepath == "") { SetFilepath(); } - if (filepath == "") + if (Filepath == "") { return false; } - using (csvParser) + using (_csvParser) { //für geneerischen Code: //int numberOfLines = File.ReadAllLines(filepath).Length; @@ -245,9 +227,9 @@ namespace Gremlin_BlazorServer.Data.DBClasses //dynamische Spaltenzuordnung in Dictonary speichern - string[] fields = csvParser.ReadFields()!; - Dictionary MappingDictionary = ReadMappingDictionaryFromFile(); - Dictionary mappingTable = MapDataHeading(fields, MappingDictionary); + string[] fields = _csvParser.ReadFields()!; + Dictionary mappingDictionary = ReadMappingDictionaryFromFile(); + Dictionary mappingTable = MapDataHeading(fields, mappingDictionary); //determine data type to be imported DataIdentificator dataIdentificator = new(mappingTable); @@ -262,12 +244,12 @@ namespace Gremlin_BlazorServer.Data.DBClasses return detectedDataTypes[0] switch { - "ProductLine" => ImportProductLine(csvParser, mappingTable), - "AccountType" => ImportAccountType(csvParser, mappingTable), - "SubMarket" => ImportSubMarket(csvParser, mappingTable), + "ProductLine" => ImportProductLine(_csvParser, mappingTable), + "AccountType" => ImportAccountType(_csvParser, mappingTable), + "SubMarket" => ImportSubMarket(_csvParser, mappingTable), "Account" => ImportAccounts(mappingTable), "Contact" => ImportContacts(mappingTable), - "LSAG" => ImportLSAG(mappingTable), + "LSAG" => ImportLsag(mappingTable), "Product" => ImportProducts(mappingTable), "CustomDescription" => ImportCustomDescriptions(),// mappingTable); _ => false, @@ -277,7 +259,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses public static bool ImportFile(string filepath) { - GenericImporter.filepath = filepath; + Filepath = filepath; return ImportFile(); } @@ -285,16 +267,16 @@ namespace Gremlin_BlazorServer.Data.DBClasses { List cDsReadFromFile = new(2500); Encoding = Encoding.GetEncoding("UTF-8"); //Custom-Descriptions-CSV hat festes Encoding. - using (csvParser) + using (_csvParser) { // Skip the row with the column names: - _ = csvParser.ReadLine(); + _ = _csvParser.ReadLine(); - while (!csvParser.EndOfData) + while (!_csvParser.EndOfData) { // Read current line fields, pointer moves to the next line. - string[] fields = csvParser.ReadFields()!; - CustomDescription ImportedCD = new() + string[] fields = _csvParser.ReadFields()!; + CustomDescription importedCd = new() { ProductNumber = fields[0], OptionNumber = fields[1], @@ -312,10 +294,10 @@ namespace Gremlin_BlazorServer.Data.DBClasses AccountName = fields[2] is "" or "RB" ? "Agilent Technologies" : fields[2] } }; - ImportedCD.DataCreationDate = ImportedCD.DataValidFrom = ImportedCD.DataModificationDate = DateTime.Now; - ImportedCD.DataVersionNumber = 1; + importedCd.DataCreationDate = importedCd.DataValidFrom = importedCd.DataModificationDate = DateTime.Now; + importedCd.DataVersionNumber = 1; - cDsReadFromFile.Add(ImportedCD); + cDsReadFromFile.Add(importedCd); } //Eingelesenen Custum Desciptions in DB schreiben: @@ -328,17 +310,17 @@ namespace Gremlin_BlazorServer.Data.DBClasses { //Step 1a List thirdPartyProductsFromImportedCDs = new(); - foreach (CustomDescription CD in cDsReadFromFile) + foreach (CustomDescription cd in cDsReadFromFile) { - if (CD.Supplier.AccountName != "Agilent Technologies") + if (cd.Supplier.AccountName != "Agilent Technologies") { - Product new3PPProduct = new() + Product new3PpProduct = new() { - CustomDescription = CD, + CustomDescription = cd, HasBreakPrices = false, ListPrice = 0, - ProductNumber = CD.ProductNumber, - OptionNumber = CD.OptionNumber, + ProductNumber = cd.ProductNumber, + OptionNumber = cd.OptionNumber, ProductStatus = Status.Active.ToString(), SapLongDescription = "", SapShortDescription = "", @@ -348,11 +330,11 @@ namespace Gremlin_BlazorServer.Data.DBClasses BreakRangeTo = 0, ProductLine = DbHelper.ResolveProductLine(db, "3P") }; - new3PPProduct.CustomDescription.Supplier = DbHelper.ResolveAccountByName(db, new3PPProduct.CustomDescription.Supplier.AccountName); - _ = MetaDataSetter.ForImport(new3PPProduct, "GenericImporter-Method", "Created at import from Custom Descriptions."); - thirdPartyProductsFromImportedCDs.Add(new3PPProduct); + new3PpProduct.CustomDescription.Supplier = DbHelper.ResolveAccountByName(db, new3PpProduct.CustomDescription.Supplier.AccountName); + _ = MetaDataSetter.ForImport(new3PpProduct, "GenericImporter-Method", "Created at import from Custom Descriptions."); + thirdPartyProductsFromImportedCDs.Add(new3PpProduct); } - }; + } //Step 1b db.Products.AddRange(thirdPartyProductsFromImportedCDs); //Imports both the products and the associated custom descriptions! @@ -360,45 +342,33 @@ namespace Gremlin_BlazorServer.Data.DBClasses // Produkt aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. //Step 2 - List importedCDsWithEFReferences = new(100000); - List cDsWithoutEFReferences = new(100); //nur zur Kontrolle, wird nicht verwendet. + List importedCDsWithEfReferences = new(100000); + List cDsWithoutEfReferences = new(100); //nur zur Kontrolle, wird nicht verwendet. List productsInDb = db.Products.ToList(); - Account agilent = db.Accounts.Where(a => a.AccountName == "Agilent Technologies").Single(); + Account agilent = db.Accounts.Single(a => a.AccountName == "Agilent Technologies"); foreach (CustomDescription cD in cDsReadFromFile) { - if (cD.Products == null) { continue; } - //Skip Desciptions, if it has been already imported above (as part from 3PP) if (thirdPartyProductsFromImportedCDs.Intersect(cD.Products).Any()) { continue; } //Establish EF Reference. If no PN/Opt found, then skip this custom description. //CD.Product = GetProduct(db, CD.ProductNumber, CD.OptionNumber); //ResolveXY-functions return null, if no match is found in db. cD.Products = productsInDb.Where(product => product.ProductNumber == cD.ProductNumber && product.OptionNumber == cD.OptionNumber).ToList(); - if (cD.Products == null) - { - cDsWithoutEFReferences.Add(cD); - continue; - } //Establish EF Reference: If no Supplier-Account found, then skip this custom description (shouldn't happen), else set Supplier to Agilent (3PP-Supplier have been processed before and their products should not be part of this list). - if (cD.Supplier == null) - { - cDsWithoutEFReferences.Add(cD); - continue; - } cD.Supplier = agilent; //prepare properties _ = MetaDataSetter.ForImport(cD, "GenericImporter-Method", "Initial import by CSV Importer (Function GenericImporter.ImportCustomDescriptions)"); //add to final list of CDs, that will go into the db. - importedCDsWithEFReferences.Add(cD); + importedCDsWithEfReferences.Add(cD); } - db.CustomDescriptions.AddRange(importedCDsWithEFReferences); + db.CustomDescriptions.AddRange(importedCDsWithEfReferences); _ = db.SaveChanges(); //Bestätigung senden - Debug.WriteLine($"Es wurden {importedCDsWithEFReferences.Count} eigene Beschreibungen erfolgreich der Datenbank hinzugefügt.{Environment.NewLine}Es wurden {thirdPartyProductsFromImportedCDs.Count} 3PP-Produkte neu angelegt."); + Debug.WriteLine($"Es wurden {importedCDsWithEfReferences.Count} eigene Beschreibungen erfolgreich der Datenbank hinzugefügt.{Environment.NewLine}Es wurden {thirdPartyProductsFromImportedCDs.Count} 3PP-Produkte neu angelegt."); } return true; } @@ -406,61 +376,46 @@ namespace Gremlin_BlazorServer.Data.DBClasses private static bool ImportProducts(Dictionary mappingTable) { - List ProductsReadFromFile = new(ParseProductFile(mappingTable)); - return InsertProducts(ProductsReadFromFile); + List productsReadFromFile = new(ParseProductFile(mappingTable)); + return InsertProducts(productsReadFromFile); } private static bool InsertProducts(List products) { - using (GremlinContext db = new()) + using GremlinContext db = new(); + List productLines = db.ProductLines.ToList(); + foreach (Product product in products) { - List productLines = db.ProductLines.ToList(); - foreach (Product product in products) - { - //var query = db.ProductLines - // .Where(a => a.ProductLineAbbreviation == product.ProductLine.ProductLineAbbreviation) - // .First(); - //product.ProductLine = query; - - //product.ProductLine = ResolveProductLine(db, product.ProductLine.ProductLineAbbreviation); - product.ProductLine = productLines.Find(x => x.ProductLineCode == product.ProductLine.ProductLineCode) ?? new ProductLine(); - _ = MetaDataSetter.ForImport(product, "GenericImporter-Method"); - } - - db.Products.AddRange(products); - _ = db.SaveChanges(); - //Bestätigung senden - Debug.WriteLine($"Es wurden {products.Count} Produkte erfolgreich der Datenbank hinzugefügt."); - return true; + //var query = db.ProductLines + // .Where(a => a.ProductLineAbbreviation == product.ProductLine.ProductLineAbbreviation) + // .First(); + //product.ProductLine = query; + + //product.ProductLine = ResolveProductLine(db, product.ProductLine.ProductLineAbbreviation); + product.ProductLine = productLines.Find(x => x.ProductLineCode == product.ProductLine.ProductLineCode) ?? new ProductLine(); + _ = MetaDataSetter.ForImport(product, "GenericImporter-Method"); } + + db.Products.AddRange(products); + _ = db.SaveChanges(); + //Bestätigung senden + Debug.WriteLine($"Es wurden {products.Count} Produkte erfolgreich der Datenbank hinzugefügt."); + return true; } private static List ParseProductFile(Dictionary columnNumberOf) - ///Importiert Produkt-Daten aus CSV (erstellt aus PriceSurfer-CPL) - /// - Encoding: Latin1 - /// - Separator = ; - /// - fixe Spaltenzahl und -folge (Überschriften werden nicht untersucht/verwendet): - /// 1) Position = ID/PK - /// 2) Partnumber - /// 3) Option - /// 4) (Short) Description - /// 5) Current Month Price (EUR) - /// 6) ProductLineID - /// 7) Status - /// 8) (Long) Description - ///Kommentarzeichen: # (hardcoded, string array) { List results = new(100000); - using (csvParser) + using (_csvParser) { - while (!csvParser.EndOfData) + while (!_csvParser.EndOfData) { // Read current line fields, pointer moves to the next line. - Product ImportedProduct = new() + Product importedProduct = new() { ProductLine = new() }; - string[] fields = csvParser.ReadFields()!; + string[] fields = _csvParser.ReadFields()!; //Kontrolle, ob Trennzeichen in Daten vorhanden ist: if (fields.Length > 27) //27 ist der Normalfall @@ -498,68 +453,65 @@ namespace Gremlin_BlazorServer.Data.DBClasses //fields[23] = End of Production Date //fields[24] = End of Support Date - ImportedProduct.ProductNumber = fields[columnNumberOf["ProductNumber"]]; + importedProduct.ProductNumber = fields[columnNumberOf["ProductNumber"]]; if (fields[columnNumberOf["OptionNumber"]].Length == 4) //Optionsnummer mit führendem Apostroph { - ImportedProduct.OptionNumber = fields[columnNumberOf["OptionNumber"]].Substring(1); //schneidet erstes Zeichen/Apostroph weg + importedProduct.OptionNumber = fields[columnNumberOf["OptionNumber"]].Substring(1); //schneidet erstes Zeichen/Apostroph weg } else if (fields[columnNumberOf["OptionNumber"]].Length == 3) //3-stellige Optionsnummer übernehmen; keine Aktion bei leerem Feld (keine Optionsnummer) { - ImportedProduct.OptionNumber = fields[columnNumberOf["OptionNumber"]]; + importedProduct.OptionNumber = fields[columnNumberOf["OptionNumber"]]; } - ImportedProduct.SapShortDescription = fields[columnNumberOf["SapShortDescription"]]; + importedProduct.SapShortDescription = fields[columnNumberOf["SapShortDescription"]]; - ImportedProduct.ListPrice = decimal.Parse(fields[columnNumberOf["ListPrice"]], new CultureInfo("de-de")); //parsing! compare with old value (either from CSV or from DB) -> price change? + importedProduct.ListPrice = decimal.Parse(fields[columnNumberOf["ListPrice"]], new CultureInfo("de-de")); //parsing! compare with old value (either from CSV or from DB) -> price change? //if (fields[columnNumberOf["ListPrice"]] != "") // if (decimal.Parse(fields[columnNumberOf["ListPrice"]], new CultureInfo("de-de")) != ImportedProduct.ListPrice) // listpriceHasChanged = true; - ImportedProduct.BreakRangeFrom = fields[columnNumberOf["BreakRangeFrom"]] == "" ? 0 : Convert.ToInt32(fields[columnNumberOf["BreakRangeFrom"]]); - ImportedProduct.HasBreakPrices = ImportedProduct.BreakRangeFrom > 0; - ImportedProduct.BreakRangeTo = fields[columnNumberOf["BreakRangeTo"]] is "" or "+" ? 0 : Convert.ToInt32(fields[columnNumberOf["BreakRangeTo"]]); //erfasst sowohl Produkte ohne Break-Preise ("") als auch "+" bei Mengenangaben a la "100+" (= von 100 bis unendlich) + importedProduct.BreakRangeFrom = fields[columnNumberOf["BreakRangeFrom"]] == "" ? 0 : Convert.ToInt32(fields[columnNumberOf["BreakRangeFrom"]]); + importedProduct.HasBreakPrices = importedProduct.BreakRangeFrom > 0; + importedProduct.BreakRangeTo = fields[columnNumberOf["BreakRangeTo"]] is "" or "+" ? 0 : Convert.ToInt32(fields[columnNumberOf["BreakRangeTo"]]); //erfasst sowohl Produkte ohne Break-Preise ("") als auch "+" bei Mengenangaben a la "100+" (= von 100 bis unendlich) - ImportedProduct.ProductLine.ProductLineCode = fields[columnNumberOf["ProductLineCode"]]; + importedProduct.ProductLine.ProductLineCode = fields[columnNumberOf["ProductLineCode"]]; switch (fields[columnNumberOf["ProductStatus"]]) { case "Active": - ImportedProduct.DataStatus = Status.Active.ToString(); - ImportedProduct.ProductStatus = Status.Active.ToString(); + importedProduct.DataStatus = Status.Active.ToString(); + importedProduct.ProductStatus = Status.Active.ToString(); break; case "New Product" or "New": - ImportedProduct.DataStatus = Status.Active.ToString(); - ImportedProduct.ProductStatus = Status.New.ToString(); + importedProduct.DataStatus = Status.Active.ToString(); + importedProduct.ProductStatus = Status.New.ToString(); break; case "Price Changed": - ImportedProduct.DataStatus = Status.Active.ToString(); - ImportedProduct.ProductStatus = Status.PriceUpdated.ToString(); + importedProduct.DataStatus = Status.Active.ToString(); + importedProduct.ProductStatus = Status.PriceUpdated.ToString(); break; default: - ImportedProduct.DataStatus = Status.StatusUpdated.ToString(); + importedProduct.DataStatus = Status.StatusUpdated.ToString(); break; } - if (fields[columnNumberOf["Weight"]] != null) - { - ImportedProduct.Weight = ParseWeight(fields[columnNumberOf["Weight"]]); - } + importedProduct.Weight = ParseWeight(fields[columnNumberOf["Weight"]]); if (fields[columnNumberOf["WeightUnit"]] == "G") { - ImportedProduct.Weight /= 1000; //Umrechnung g in kg + importedProduct.Weight /= 1000; //Umrechnung g in kg } if (fields[columnNumberOf["IntroductionDate"]] != "") { - ImportedProduct.IntroductionDate = DateTime.Parse(fields[columnNumberOf["IntroductionDate"]]); + importedProduct.IntroductionDate = DateTime.Parse(fields[columnNumberOf["IntroductionDate"]]); } - ImportedProduct.SapLongDescription = fields[columnNumberOf["SapLongDescription"]]; + importedProduct.SapLongDescription = fields[columnNumberOf["SapLongDescription"]]; - results.Add(ImportedProduct); + results.Add(importedProduct); } } @@ -586,46 +538,45 @@ namespace Gremlin_BlazorServer.Data.DBClasses } - private static bool ImportLSAG(Dictionary mappingTable) + private static bool ImportLsag(Dictionary mappingTable) { - bool result; - result = ImportAccounts(mappingTable); + bool result = ImportAccounts(mappingTable); ResetParser(); - _ = csvParser.ReadFields(); //Skip Heading + _ = _csvParser.ReadFields(); //Skip Heading result = result && ImportContacts(mappingTable); return result; } - public static bool ImportContacts(Dictionary columnNumberOf) + private static bool ImportContacts(Dictionary columnNumberOf) { - List ContactsReadFromFile = new(8000); - using (csvParser) + List contactsReadFromFile = new(8000); + using (_csvParser) { - while (!csvParser.EndOfData) + while (!_csvParser.EndOfData) { - Contact ImportedContact = new(); - string[] fields = csvParser.ReadFields()!; + Contact importedContact = new(); + string[] fields = _csvParser.ReadFields()!; //No conversion - ImportedContact.AcademicTitle = fields[columnNumberOf["AcademicTitle"]]; - ImportedContact.FirstName = fields[columnNumberOf["FirstName"]]; - ImportedContact.LastName = fields[columnNumberOf["LastName"]]; - ImportedContact.EMail = fields[columnNumberOf["EMail"]]; - ImportedContact.Department = fields[columnNumberOf["Department"]]; - ImportedContact.Room = fields[columnNumberOf["Room"]]; - ImportedContact.PhoneNumber = fields[columnNumberOf["PhoneNumber"]]; - ImportedContact.Function = fields[columnNumberOf["Function"]]; - ImportedContact.MobileNumber = fields[columnNumberOf["MobileNumber"]]; + importedContact.AcademicTitle = fields[columnNumberOf["AcademicTitle"]]; + importedContact.FirstName = fields[columnNumberOf["FirstName"]]; + importedContact.LastName = fields[columnNumberOf["LastName"]]; + importedContact.EMail = fields[columnNumberOf["EMail"]]; + importedContact.Department = fields[columnNumberOf["Department"]]; + importedContact.Room = fields[columnNumberOf["Room"]]; + importedContact.PhoneNumber = fields[columnNumberOf["PhoneNumber"]]; + importedContact.Function = fields[columnNumberOf["Function"]]; + importedContact.MobileNumber = fields[columnNumberOf["MobileNumber"]]; //Convert Gender - ImportedContact.Gender = fields[columnNumberOf["Gender"]] == "M" + importedContact.Gender = fields[columnNumberOf["Gender"]] == "M" ? (byte)Gender.Male : fields[columnNumberOf["Gender"]] == "F" ? (byte)Gender.Female : (byte)Gender.Unknown; //Convert OptIn Status - ImportedContact.OptInStatus = fields[columnNumberOf["OptInStatus"]] switch + importedContact.OptInStatus = fields[columnNumberOf["OptInStatus"]] switch { "Opt In" => true, "Opt Out" => false, @@ -635,7 +586,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses //Convert "SAP Contact Number" try { - ImportedContact.SAPContactNumber = Convert.ToInt32(fields[columnNumberOf["SAPContactNumber"]], CultureInfo.CurrentCulture); + importedContact.SapContactNumber = Convert.ToInt32(fields[columnNumberOf["SAPContactNumber"]], CultureInfo.CurrentCulture); } catch (FormatException ex) { @@ -668,30 +619,30 @@ namespace Gremlin_BlazorServer.Data.DBClasses int year = Convert.ToInt32(fields[columnNumberOf["SAPContactCreationDate"]].Substring(0, 4), CultureInfo.CurrentCulture); int month = Convert.ToInt32(fields[columnNumberOf["SAPContactCreationDate"]].Substring(4, 2), CultureInfo.CurrentCulture); int day = Convert.ToInt32(fields[columnNumberOf["SAPContactCreationDate"]].Substring(6, 2), CultureInfo.CurrentCulture); - ImportedContact.SAPContactCreationDate = new DateTime(year, month, day); + importedContact.SapContactCreationDate = new DateTime(year, month, day); //Convert "No Phone Calls" if (fields[columnNumberOf["NoPhoneCalls"]] == "1") { - ImportedContact.NoPhoneCalls = true; + importedContact.NoPhoneCalls = true; } //Convert "No Hardcopy Mailing" if (fields[columnNumberOf["NoHardcopyMailing"]] == "1") { - ImportedContact.NoHardcopyMailing = true; + importedContact.NoHardcopyMailing = true; } //SAPAccountID in Contact.Notes speichern, um den entsprechenden Account aus DB heraussuchen zu können: - ImportedContact.Notes = fields[columnNumberOf["SAPAccountNumber"]]; + importedContact.Notes = fields[columnNumberOf["SAPAccountNumber"]]; - ContactsReadFromFile.Add(ImportedContact); + contactsReadFromFile.Add(importedContact); } //Eingelesenen Account in DB schreiben: using (GremlinContext db = new()) { - foreach (Contact contact in ContactsReadFromFile) + foreach (Contact contact in contactsReadFromFile) { // AccountID aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. contact.Account = DbHelper.ResolveAccountById(db, Convert.ToUInt32(contact.Notes)); @@ -700,56 +651,38 @@ namespace Gremlin_BlazorServer.Data.DBClasses _ = MetaDataSetter.ForImport(contact, "GenericImporter-Method"); } - db.Contacts.AddRange(ContactsReadFromFile); + db.Contacts.AddRange(contactsReadFromFile); _ = db.SaveChanges(); } } //Bestätigung senden - Debug.WriteLine($"Es wurden {ContactsReadFromFile.Count} Contacts erfolgreich der Datenbank hinzugefügt."); + Debug.WriteLine($"Es wurden {contactsReadFromFile.Count} Contacts erfolgreich der Datenbank hinzugefügt."); return true; } - public static bool ImportAccounts(Dictionary columnNumberOf) - ///Importiert Account Daten aus CSV (erstellt aus LSAG_Contact_List_Tool.xlsx) - /// - /// - Encoding: Latin1/ISO-8859-1 - /// - fixe Spaltenzahl und -folge (Überschriften werden nicht untersucht/verwendet): - /// 1) SAPAccountNumber - /// 2) AccountName - /// 3) ZIP - /// 4) City - /// 5) Street - /// 6) AccountSubMarketCode - /// 7) AccountTypeCode - /// 8) PhoneNumber - /// 9) AccountsCreatedInSAP - ///Kommentarzeichen: # (hardcoded, string array) - ///Rückgabe 'false' bei Fehler oder User-Abbruch, ansonsten 'true'. - /// - ///Argumente: - /// 1. + private static bool ImportAccounts(Dictionary columnNumberOf) { - List AccountsReadFromFile = new(1000); + List accountsReadFromFile = new(1000); - while (!csvParser.EndOfData) + while (!_csvParser.EndOfData) { - bool DataHasError = false; + bool dataHasError = false; // Read current line fields, pointer moves to the next line. - Account ImportedAccount = new(); + Account importedAccount = new(); { - ImportedAccount.SubMarket = new(); - ImportedAccount.AccountType = new(); - ImportedAccount.Contacts = new List(); + importedAccount.SubMarket = new(); + importedAccount.AccountType = new(); + importedAccount.Contacts = new List(); } - string[] fields = csvParser.ReadFields()!; + string[] fields = _csvParser.ReadFields()!; //Konvertierung erforderlich: try { - ImportedAccount.SAPAccountNumber = Convert.ToUInt32(fields[columnNumberOf["SAPAccountNumber"]]); + importedAccount.SapAccountNumber = Convert.ToUInt32(fields[columnNumberOf["SAPAccountNumber"]]); } catch (FormatException ex) { @@ -780,7 +713,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses try { - ImportedAccount.ZIP = Convert.ToUInt32(fields[columnNumberOf["ZIP"]]); + importedAccount.Zip = Convert.ToUInt32(fields[columnNumberOf["ZIP"]]); } catch (FormatException ex) { @@ -818,77 +751,73 @@ namespace Gremlin_BlazorServer.Data.DBClasses int year = Convert.ToInt32(fields[columnNumber].Substring(0, 4)); int month = Convert.ToInt32(fields[columnNumber].Substring(4, 2)); int day = Convert.ToInt32(fields[columnNumber].Substring(6, 2)); - ImportedAccount.AccountCreatedInSAPOn = new DateTime(year, month, day); + importedAccount.AccountCreatedInSapOn = new DateTime(year, month, day); } } //Convert City von Großschreibung zu Normalschreibung - ImportedAccount.City = fields[columnNumberOf["City"]].First().ToString() + fields[columnNumberOf["City"]].Substring(1).ToLower(); + importedAccount.City = fields[columnNumberOf["City"]].First().ToString() + fields[columnNumberOf["City"]].Substring(1).ToLower(); //keine Konvertierung nötig: - ImportedAccount.AccountName = fields[columnNumberOf["AccountName"]]; - ImportedAccount.Street = fields[columnNumberOf["Street"]]; - ImportedAccount.SubMarket.SubMarketCode = fields[columnNumberOf["SubMarketCode"]]; - ImportedAccount.SubMarket.DataStatus = Status.Active.ToString(); - ImportedAccount.AccountType.AccountTypeCode = fields[columnNumberOf["AccountTypeCode"]]; - ImportedAccount.AccountType.DataStatus = Status.Active.ToString(); - ImportedAccount.PhoneNumber = fields[columnNumberOf["PhoneNumber"]]; - ImportedAccount.DataStatus = Status.Active.ToString(); + importedAccount.AccountName = fields[columnNumberOf["AccountName"]]; + importedAccount.Street = fields[columnNumberOf["Street"]]; + importedAccount.SubMarket.SubMarketCode = fields[columnNumberOf["SubMarketCode"]]; + importedAccount.SubMarket.DataStatus = Status.Active.ToString(); + importedAccount.AccountType.AccountTypeCode = fields[columnNumberOf["AccountTypeCode"]]; + importedAccount.AccountType.DataStatus = Status.Active.ToString(); + importedAccount.PhoneNumber = fields[columnNumberOf["PhoneNumber"]]; + importedAccount.DataStatus = Status.Active.ToString(); //Validierungen: - if (ImportedAccount.AccountName == "" - || ImportedAccount.City == "" - || ImportedAccount.Street == "" - || ImportedAccount.SubMarket.SubMarketCode == "" - || ImportedAccount.AccountType.AccountTypeCode == "" - || ImportedAccount.SAPAccountNumber == 0) + if (importedAccount.AccountName == "" + || importedAccount.City == "" + || importedAccount.Street == "" + || importedAccount.SubMarket.SubMarketCode == "" + || importedAccount.AccountType.AccountTypeCode == "" + || importedAccount.SapAccountNumber == 0) { - DataHasError = true; + dataHasError = true; } //Validierten Account der Liste hinzufügen: - if (DataHasError == false) + if (dataHasError == false) { - _ = ImportedAccount.AddIfUniqueTo(AccountsReadFromFile); + _ = importedAccount.AddIfUniqueTo(accountsReadFromFile); } } //Eingelesenen Account in DB schreiben: - DateTime now = DateTime.Now; - foreach (Account account in AccountsReadFromFile) + foreach (Account account in accountsReadFromFile) { // AccountType aus DB laden, damit der Datensatz vom Context verfolgt wird und EF Core nicht versucht, diesen standardmäßig neu anzulegen. - AccountType accountType = db.AccountTypes - .Where(a => a.AccountTypeCode == account.AccountType.AccountTypeCode) - .First(); + AccountType accountType = Db.AccountTypes + .First(a => a.AccountTypeCode == account.AccountType.AccountTypeCode); account.AccountType = accountType; - account.AccountType = DbHelper.ResolveAccountType(db, account.AccountType.AccountTypeCode); + account.AccountType = DbHelper.ResolveAccountType(Db, account.AccountType.AccountTypeCode); - SubMarket subMarket = db.SubMarkets - .Where(a => a.SubMarketCode == account.SubMarket.SubMarketCode) - .First(); + SubMarket subMarket = Db.SubMarkets + .First(a => a.SubMarketCode == account.SubMarket.SubMarketCode); account.SubMarket = subMarket; - account.SubMarket = DbHelper.ResolveSubmarket(db, account.SubMarket.SubMarketCode); + account.SubMarket = DbHelper.ResolveSubmarket(Db, account.SubMarket.SubMarketCode); _ = MetaDataSetter.ForImport(account, "GenericImporter-Method"); //account.DataVersionComment = "Initial import by CSV Importer (Function DbHelper.ImportAccountsFromCSV)"; } - db.Accounts.AddRange(AccountsReadFromFile); - _ = db.SaveChanges(); + Db.Accounts.AddRange(accountsReadFromFile); + _ = Db.SaveChanges(); //Bestätigung senden - Debug.WriteLine($"Es wurden {AccountsReadFromFile.Count} Accounts erfolgreich der Datenbank hinzugefügt."); + Debug.WriteLine($"Es wurden {accountsReadFromFile.Count} Accounts erfolgreich der Datenbank hinzugefügt."); return true; } - - public static bool ImportProductLine(TextFieldParser csvParser, Dictionary mappingTable) + private static bool ImportProductLine(TextFieldParser csvParser, Dictionary mappingTable) { //foreach line in file: //read seed data, parse/split, save to object with metadata @@ -909,13 +838,13 @@ namespace Gremlin_BlazorServer.Data.DBClasses } } - db.ProductLines.AddRange(productLinesReadFromFile); - _ = db.SaveChanges(); + Db.ProductLines.AddRange(productLinesReadFromFile); + _ = Db.SaveChanges(); return true; } - public static bool ImportAccountType(TextFieldParser csvParser, Dictionary mappingTable) + private static bool ImportAccountType(TextFieldParser csvParser, Dictionary mappingTable) { //foreach line in file: //read seed data, parse/split, save to object with metadata @@ -936,13 +865,13 @@ namespace Gremlin_BlazorServer.Data.DBClasses } } - db.AccountTypes.AddRange(accountTypesReadFromFile); - _ = db.SaveChanges(); + Db.AccountTypes.AddRange(accountTypesReadFromFile); + _ = Db.SaveChanges(); return true; } - public static bool ImportSubMarket(TextFieldParser csvParser, Dictionary mappingTable) + private static bool ImportSubMarket(TextFieldParser csvParser, Dictionary mappingTable) { //foreach line in file: //read seed data, parse/split, save to object with metadata @@ -963,8 +892,8 @@ namespace Gremlin_BlazorServer.Data.DBClasses } } - db.SubMarkets.AddRange(subMarketsReadFromFile); - _ = db.SaveChanges(); + Db.SubMarkets.AddRange(subMarketsReadFromFile); + _ = Db.SaveChanges(); return true; } @@ -1000,21 +929,20 @@ namespace Gremlin_BlazorServer.Data.DBClasses // return Activator.CreateInstance(Gremlin.ToString(), "Gremlin." + detectedDataType).Unwrap(); //} - public static Dictionary ReadMappingDictionaryFromFile() + private static Dictionary ReadMappingDictionaryFromFile() { Dictionary result = new(); string fileInput = FileService.ReadResource("MappingDictionary.txt"); string[] lines = fileInput.Split(Environment.NewLine); foreach (string line in lines) { - string[] fields; - fields = line.Split("|"); + string[] fields = line.Split("|"); result.Add(fields[0], fields[1]); } return result; } - public static Dictionary MapDataHeading(string[] headings, Dictionary columnPropertyMapping) + private static Dictionary MapDataHeading(string[] headings, Dictionary columnPropertyMapping) { Dictionary result = new(); for (int i = 0; i < headings.Length; i++) diff --git a/Gremlin_BlazorServer/Data/DBClasses/GremlinContext.cs b/Gremlin_BlazorServer/Data/DBClasses/GremlinContext.cs index d87f394..4bb8c77 100644 --- a/Gremlin_BlazorServer/Data/DBClasses/GremlinContext.cs +++ b/Gremlin_BlazorServer/Data/DBClasses/GremlinContext.cs @@ -1,5 +1,4 @@ using Gremlin_BlazorServer.Data.EntityClasses; -using Gremlin_BlazorServer.Services; using Microsoft.EntityFrameworkCore; using System.Diagnostics; @@ -7,7 +6,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses { public class GremlinContext : DbContext { - public DbSet Contacts { get; set; } + public DbSet Contacts { get; set; } public DbSet Accounts { get; set; } public DbSet Quotes { get; set; } public DbSet Products { get; set; } @@ -16,7 +15,7 @@ namespace Gremlin_BlazorServer.Data.DBClasses public DbSet ProductLines { get; set; } public DbSet AccountTypes { get; set; } public DbSet SubMarkets { get; set; } - public DbSet RUSettings { get; set; } + public DbSet RuSettings { get; set; } public DbSet RegisteredUser { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) diff --git a/Gremlin_BlazorServer/Data/DBClasses/GremlinTypeConverter.cs b/Gremlin_BlazorServer/Data/DBClasses/GremlinTypeConverter.cs deleted file mode 100644 index 19914b3..0000000 --- a/Gremlin_BlazorServer/Data/DBClasses/GremlinTypeConverter.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Gremlin_BlazorServer.Data.DBClasses -{ - internal class GremlinTypeConverter - { - internal static object Convert(string stringToConvert) - { - //noch nicht implementiert. - //für vollkommen generischen Importer - // - return stringToConvert; - } - } -} \ No newline at end of file diff --git a/Gremlin_BlazorServer/Data/DBClasses/MetaDataSetter.cs b/Gremlin_BlazorServer/Data/DBClasses/MetaDataSetter.cs index e884ef6..9ae6d4d 100644 --- a/Gremlin_BlazorServer/Data/DBClasses/MetaDataSetter.cs +++ b/Gremlin_BlazorServer/Data/DBClasses/MetaDataSetter.cs @@ -19,28 +19,6 @@ namespace Gremlin_BlazorServer.Data.DBClasses return entity; } - public static List ForImport( - List entities, - string datamodifiedby = "", - string dataversioncomment = "", - [CallerMemberName] string callername = "") - { - //check if entities implements IMetaData: - //Ist das überhaupt nötig? - if ((entities is IMetadata) == false) - { - //no action / return list unchanged - return entities; - } - - //set metadata - foreach (IMetadata entity in entities) - { - _ = SetMetaData(entity, datamodifiedby, dataversioncomment, callername); - } - return entities; - } - private static IMetadata SetMetaData( IMetadata entity, string datamodifiedby = "", diff --git a/Gremlin_BlazorServer/Data/EntityClasses/Account.cs b/Gremlin_BlazorServer/Data/EntityClasses/Account.cs index 97a427b..b3e24a9 100644 --- a/Gremlin_BlazorServer/Data/EntityClasses/Account.cs +++ b/Gremlin_BlazorServer/Data/EntityClasses/Account.cs @@ -17,19 +17,19 @@ public string AccountName { get; set; } = string.Empty; public string Notes { get; set; } = string.Empty; public string Street { get; set; } = string.Empty; - public uint ZIP { get; set; } + public uint Zip { get; set; } public string City { get; set; } = string.Empty; public string FloorOrBuilding { get; set; } = string.Empty; - public float Longitude { get; set; } = 0; - public float Latitude { get; set; } = 0; + public float Longitude { get; set; } + public float Latitude { get; set; } public string PhoneNumber { get; set; } = string.Empty; public string FaxNumber { get; set; } = string.Empty; public string Webpage { get; set; } = string.Empty; public string EMail { get; set; } = string.Empty; //Agilent-specific Properties: - public uint SAPAccountNumber { get; set; } - public DateTime AccountCreatedInSAPOn { get; set; } + public uint SapAccountNumber { get; set; } + public DateTime AccountCreatedInSapOn { get; set; } //metadata: public DateTime DataCreationDate { get; set; } = DateTime.Now; @@ -87,14 +87,14 @@ public List AddIfUniqueTo(List accounts) { - if (accounts.Count > 0 && SAPAccountNumber == accounts[accounts.Count - 1].SAPAccountNumber) + if (accounts.Count > 0 && SapAccountNumber == accounts[^1].SapAccountNumber) { return accounts; } foreach (Account account in accounts) { - if (SAPAccountNumber == account.SAPAccountNumber) + if (SapAccountNumber == account.SapAccountNumber) { return accounts; } diff --git a/Gremlin_BlazorServer/Data/EntityClasses/Contact.cs b/Gremlin_BlazorServer/Data/EntityClasses/Contact.cs index 639594d..070e7e1 100644 --- a/Gremlin_BlazorServer/Data/EntityClasses/Contact.cs +++ b/Gremlin_BlazorServer/Data/EntityClasses/Contact.cs @@ -33,14 +33,14 @@ public bool ValidatedContact { get; set; } //Agilent-specific Properties: - public int SAPContactNumber { get; set; } - public DateTime SAPContactCreationDate { get; set; } - public DateTime SAPContactModifiedDate { get; set; } - public string SAPJobFunction { get; set; } = string.Empty; - public string SAPProductInterest { get; set; } = string.Empty; - public string SAPApplicationInterest { get; set; } = string.Empty; - public string SAPJobLevel { get; set; } = string.Empty; - public string SAPCompetitiveIBase { get; set; } = string.Empty; + public int SapContactNumber { get; set; } + public DateTime SapContactCreationDate { get; set; } + public DateTime SapContactModifiedDate { get; set; } + public string SapJobFunction { get; set; } = string.Empty; + public string SapProductInterest { get; set; } = string.Empty; + public string SapApplicationInterest { get; set; } = string.Empty; + public string SapJobLevel { get; set; } = string.Empty; + public string SapCompetitiveIBase { get; set; } = string.Empty; //metadata: public DateTime DataCreationDate { get; set; } = DateTime.Now; diff --git a/Gremlin_BlazorServer/Data/EntityClasses/Enums.cs b/Gremlin_BlazorServer/Data/EntityClasses/Enums.cs index 8685c3e..b11694a 100644 --- a/Gremlin_BlazorServer/Data/EntityClasses/Enums.cs +++ b/Gremlin_BlazorServer/Data/EntityClasses/Enums.cs @@ -1,6 +1,6 @@ namespace Gremlin_BlazorServer.Data.EntityClasses { - public class Enums + public abstract class Enums { public enum Status : byte { @@ -34,7 +34,7 @@ Unknown = 0, Male = 1, Female = 2, - divers = 3, + Divers = 3, } } diff --git a/Gremlin_BlazorServer/Data/EntityClasses/Quote.cs b/Gremlin_BlazorServer/Data/EntityClasses/Quote.cs index 7ab692b..904caad 100644 --- a/Gremlin_BlazorServer/Data/EntityClasses/Quote.cs +++ b/Gremlin_BlazorServer/Data/EntityClasses/Quote.cs @@ -21,15 +21,15 @@ public decimal TotalListprice { get; set; } public decimal TotalDiscount { get; set; } public decimal TotalNet { get; set; } - public float VAT { get; set; } = 19f; + public float Vat { get; set; } = 19f; public decimal TotalGross { get; set; } - public bool QuoteContains3PP { get; set; } - public bool QuoteContainsRB { get; set; } + public bool QuoteContains3Pp { get; set; } + public bool QuoteContainsRb { get; set; } public string QuoteTemplate { get; set; } = string.Empty; public int Warranty { get; set; } = 12; public decimal TotalFreightOnly { get; set; } public decimal TotalFreight { get; set; } - public decimal TotalVAT { get; set; } + public decimal TotalVat { get; set; } public decimal Freight { get; set; } = 3; public bool IsPriceInformation { get; set; } public bool ShowSinglePrices { get; set; } = true; diff --git a/Gremlin_BlazorServer/Data/EntityClasses/RUSettings.cs b/Gremlin_BlazorServer/Data/EntityClasses/RUSettings.cs index 268b026..1860753 100644 --- a/Gremlin_BlazorServer/Data/EntityClasses/RUSettings.cs +++ b/Gremlin_BlazorServer/Data/EntityClasses/RUSettings.cs @@ -1,14 +1,14 @@ namespace Gremlin_BlazorServer.Data.EntityClasses { - public class RUSettings : IDisposable + public class RuSettings : IDisposable { private bool disposedValue; //primary key - public uint RUSettingsID { get; set; } + public uint RuSettingsId { get; set; } //forgein key - public uint RegisteredUserID { get; set; } + public uint RegisteredUserId { get; set; } //navigation properties public RegisteredUser RegisteredUser { get; set; } = new RegisteredUser(); diff --git a/Gremlin_BlazorServer/Data/EntityClasses/RegisteredUser.cs b/Gremlin_BlazorServer/Data/EntityClasses/RegisteredUser.cs index 81bff09..694a8de 100644 --- a/Gremlin_BlazorServer/Data/EntityClasses/RegisteredUser.cs +++ b/Gremlin_BlazorServer/Data/EntityClasses/RegisteredUser.cs @@ -3,10 +3,10 @@ public class RegisteredUser { //primary key - public uint RegisteredUserID { get; set; } + public uint RegisteredUserId { get; set; } //navigation properties - public IList RUSettings { get; set; } = new List(); + public IList RuSettings { get; set; } = new List(); //class properties public string UserName { get; set; } = string.Empty; diff --git a/Gremlin_BlazorServer/Folder.DotSettings b/Gremlin_BlazorServer/Folder.DotSettings new file mode 100644 index 0000000..2895de4 --- /dev/null +++ b/Gremlin_BlazorServer/Folder.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Gremlin_BlazorServer/Gremlin_BlazorServer.csproj b/Gremlin_BlazorServer/Gremlin_BlazorServer.csproj index a0c6571..ce031e4 100644 --- a/Gremlin_BlazorServer/Gremlin_BlazorServer.csproj +++ b/Gremlin_BlazorServer/Gremlin_BlazorServer.csproj @@ -13,7 +13,7 @@ - + all @@ -22,8 +22,8 @@ - - + + diff --git a/Gremlin_BlazorServer/Pages/AccountTypes/Index.razor b/Gremlin_BlazorServer/Pages/AccountTypes/Index.razor index 087506b..f47df72 100644 --- a/Gremlin_BlazorServer/Pages/AccountTypes/Index.razor +++ b/Gremlin_BlazorServer/Pages/AccountTypes/Index.razor @@ -5,7 +5,7 @@ @using System.Globalization; @using System.Diagnostics; -@inject AccountTypeService accountTypeService +@inject AccountTypeService AccountTypeService

AccountTypes

@@ -38,7 +38,7 @@ else } @code { - public string searchAccountType = string.Empty; + public string SearchAccountType = string.Empty; CultureInfo cultureInfo = new("de-DE"); AccountType selectedAccountType = new(); @@ -46,7 +46,7 @@ else protected override async Task OnParametersSetAsync() { - accountTypes = await Task.Run(() => accountTypeService.GetAllAccountTypesAsync()); + accountTypes = await Task.Run(() => AccountTypeService.GetAllAccountTypesAsync()); selectedAccountType = accountTypes.FirstOrDefault()!; } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Accounts/Add.razor b/Gremlin_BlazorServer/Pages/Accounts/Add.razor index 12d91ad..83ab98c 100644 --- a/Gremlin_BlazorServer/Pages/Accounts/Add.razor +++ b/Gremlin_BlazorServer/Pages/Accounts/Add.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject AccountService accountService -@inject NavigationManager navigationManager +@inject AccountService AccountService +@inject NavigationManager NavigationManager

Add Account


@@ -14,7 +14,7 @@
- +
@@ -26,7 +26,7 @@
- +
@@ -54,11 +54,11 @@ account.DataModificationByUser = "Gremlin_BlazorServer"; account.AccountType.AccountTypeCode = "SUP"; - if (await accountService.InsertAccountAsync(account)) + if (await AccountService.InsertAccountAsync(account)) { - navigationManager.NavigateTo("Accounts/Index"); + NavigationManager.NavigateTo("Accounts/Index"); } } - void Cancel() => navigationManager.NavigateTo("Accounts/Index"); + void Cancel() => NavigationManager.NavigateTo("Accounts/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Accounts/Delete.razor b/Gremlin_BlazorServer/Pages/Accounts/Delete.razor index 1b3eca0..898b3fc 100644 --- a/Gremlin_BlazorServer/Pages/Accounts/Delete.razor +++ b/Gremlin_BlazorServer/Pages/Accounts/Delete.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject AccountService accountService -@inject NavigationManager navigationManager +@inject AccountService AccountService +@inject NavigationManager NavigationManager

Delete Employee


@@ -26,7 +26,7 @@
- +
@@ -52,15 +52,15 @@ protected override async Task OnInitializedAsync() { - account = await Task.Run(() => accountService.GetAccountAsync(Convert.ToUInt32(AccountId))); + account = await Task.Run(() => AccountService.GetAccountAsync(Convert.ToUInt32(AccountId))); } protected async void DeleteAccount() { - await accountService.DeleteAccountAsync(account); - navigationManager.NavigateTo("Accounts/Index"); + await AccountService.DeleteAccountAsync(account); + NavigationManager.NavigateTo("Accounts/Index"); } void Cancel() { - navigationManager.NavigateTo("Accounts/Index"); + NavigationManager.NavigateTo("Accounts/Index"); } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Accounts/Edit.razor b/Gremlin_BlazorServer/Pages/Accounts/Edit.razor index c95cc72..3ec39c0 100644 --- a/Gremlin_BlazorServer/Pages/Accounts/Edit.razor +++ b/Gremlin_BlazorServer/Pages/Accounts/Edit.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject AccountService accountService -@inject NavigationManager navigationManager +@inject AccountService AccountService +@inject NavigationManager NavigationManager

Edit Account


@@ -18,7 +18,7 @@
- +
@@ -30,7 +30,7 @@
- +
@@ -57,14 +57,14 @@ protected override async Task OnInitializedAsync() { - account = await Task.Run(() => accountService.GetAccountAsync(Convert.ToUInt32(AccountId))); + account = await Task.Run(() => AccountService.GetAccountAsync(Convert.ToUInt32(AccountId))); } protected async void UpdateAccount() { - await accountService.UpdateAccountAsync(account); - navigationManager.NavigateTo("Accounts/Index"); + await AccountService.UpdateAccountAsync(account); + NavigationManager.NavigateTo("Accounts/Index"); } - void Cancel() => navigationManager.NavigateTo("Accounts/Index"); + void Cancel() => NavigationManager.NavigateTo("Accounts/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Accounts/Index.razor b/Gremlin_BlazorServer/Pages/Accounts/Index.razor index 76a7365..e44485b 100644 --- a/Gremlin_BlazorServer/Pages/Accounts/Index.razor +++ b/Gremlin_BlazorServer/Pages/Accounts/Index.razor @@ -3,13 +3,13 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject AccountService accountService +@inject AccountService AccountService

Accounts

@@ -34,9 +34,9 @@ else @nameof(Account.AccountId) @nameof(Account.AccountName) @nameof(Account.Street) - @nameof(Account.ZIP) + @nameof(Account.Zip) @nameof(Account.City) - @nameof(Account.SAPAccountNumber) + @nameof(Account.SapAccountNumber) @@ -45,9 +45,9 @@ else @account.AccountId @account.AccountName @account.Street - @account.ZIP + @account.Zip @account.City - @account.SAPAccountNumber + @account.SapAccountNumber @@ -65,18 +65,18 @@ else @code { - public string searchAccount = ""; + public string SearchAccount = ""; List allAccounts = new(); List filteredAccounts = new(); protected override async Task OnInitializedAsync() { - allAccounts = await Task.Run(() => accountService.GetAllAccountsAsync()); + allAccounts = await Task.Run(() => AccountService.GetAllAccountsAsync()); filteredAccounts = allAccounts; } private void SearchAccount_OnChange() { - filteredAccounts = allAccounts.Where(a => a.AccountName.ToLower().Contains(searchAccount.ToLower())).ToList(); + filteredAccounts = allAccounts.Where(a => a.AccountName.ToLower().Contains(SearchAccount.ToLower())).ToList(); } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Contacts/Add.razor b/Gremlin_BlazorServer/Pages/Contacts/Add.razor index 0ded930..71d8aef 100644 --- a/Gremlin_BlazorServer/Pages/Contacts/Add.razor +++ b/Gremlin_BlazorServer/Pages/Contacts/Add.razor @@ -3,9 +3,9 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject ContactService contactService -@inject NavigationManager navigationManager -@inject AccountService accountService +@inject ContactService ContactService +@inject NavigationManager NavigationManager +@inject AccountService AccountService

Add Contact


@@ -39,7 +39,7 @@
- +
@@ -62,11 +62,11 @@ contact.DataModificationByUser = "Gremlin_BlazorServer"; //contact.DataStatus = "Active"; - if (await contactService.InsertContactAsync(contact)) + if (await ContactService.InsertContactAsync(contact)) { - navigationManager.NavigateTo("Contacts/Index"); + NavigationManager.NavigateTo("Contacts/Index"); } } - void Cancel() => navigationManager.NavigateTo("Contacts/Index"); + void Cancel() => NavigationManager.NavigateTo("Contacts/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Contacts/Delete.razor b/Gremlin_BlazorServer/Pages/Contacts/Delete.razor index 4cfab65..b6ef4f3 100644 --- a/Gremlin_BlazorServer/Pages/Contacts/Delete.razor +++ b/Gremlin_BlazorServer/Pages/Contacts/Delete.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject ContactService contactService -@inject NavigationManager navigationManager +@inject ContactService ContactService +@inject NavigationManager NavigationManager

Delete Employee


@@ -38,7 +38,7 @@
- +
@@ -55,20 +55,20 @@ @code { [Parameter] - public string contactId { get; set; } = default!; + public string ContactId { get; set; } = default!; Contact contact = new Contact(); protected override async Task OnInitializedAsync() { - contact = await Task.Run(() => contactService.GetContactAsync(Convert.ToUInt32(contactId))); + contact = await Task.Run(() => ContactService.GetContactAsync(Convert.ToUInt32(ContactId))); } protected async void DeleteContact() { - await contactService.DeleteContactAsync(contact); - navigationManager.NavigateTo("Contacts/Index"); + await ContactService.DeleteContactAsync(contact); + NavigationManager.NavigateTo("Contacts/Index"); } void Cancel() { - navigationManager.NavigateTo("Contacts/Index"); + NavigationManager.NavigateTo("Contacts/Index"); } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Contacts/Edit.razor b/Gremlin_BlazorServer/Pages/Contacts/Edit.razor index 3ec07cd..c372c3a 100644 --- a/Gremlin_BlazorServer/Pages/Contacts/Edit.razor +++ b/Gremlin_BlazorServer/Pages/Contacts/Edit.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject ContactService contactService -@inject NavigationManager navigationManager +@inject ContactService ContactService +@inject NavigationManager NavigationManager

Edit Contact


@@ -38,7 +38,7 @@
- +
@@ -55,12 +55,12 @@ @code { [Parameter] - public string contactId { get; set; } = string.Empty; + public string ContactId { get; set; } = string.Empty; Contact contact = new Contact(); protected override async Task OnInitializedAsync() { - contact = await Task.Run(() => contactService.GetContactAsync(Convert.ToUInt32(contactId))); + contact = await Task.Run(() => ContactService.GetContactAsync(Convert.ToUInt32(ContactId))); } protected async void UpdateContact() @@ -68,9 +68,9 @@ contact.DataModificationByUser = "Gremlin_BlazorServer"; contact.DataModificationDate = DateTime.Now; contact.DataVersionNumber++; - await contactService.UpdateContactAsync(contact); - navigationManager.NavigateTo("Contacts/Index"); + await ContactService.UpdateContactAsync(contact); + NavigationManager.NavigateTo("Contacts/Index"); } - void Cancel() => navigationManager.NavigateTo("Contacts/Index"); + void Cancel() => NavigationManager.NavigateTo("Contacts/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Contacts/Index.razor b/Gremlin_BlazorServer/Pages/Contacts/Index.razor index 7c4e8d7..ae11ae8 100644 --- a/Gremlin_BlazorServer/Pages/Contacts/Index.razor +++ b/Gremlin_BlazorServer/Pages/Contacts/Index.razor @@ -3,7 +3,7 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject ContactService contactService +@inject ContactService ContactService

Contacts

@@ -15,7 +15,7 @@ - + @@ -24,7 +24,7 @@ LastName AccountName AccountStreet - AccountZIP + AccountZIP AccountCity @@ -35,7 +35,7 @@ protected override async Task OnInitializedAsync() { - contacts = await Task.Run(() => contactService.GetAllContactsAsync()); + contacts = await Task.Run(() => ContactService.GetAllContactsAsync()); selectedContact = contacts[0]; } diff --git a/Gremlin_BlazorServer/Pages/CustomDescriptions/Add.razor b/Gremlin_BlazorServer/Pages/CustomDescriptions/Add.razor index 2a82e49..2ee1300 100644 --- a/Gremlin_BlazorServer/Pages/CustomDescriptions/Add.razor +++ b/Gremlin_BlazorServer/Pages/CustomDescriptions/Add.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject CustomDescriptionService customDescriptionService -@inject NavigationManager navigationManager +@inject CustomDescriptionService CustomDescriptionService +@inject NavigationManager NavigationManager

Add CustomDescription


@@ -52,11 +52,11 @@ { customDescription.DataModificationByUser = "Gremlin_BlazorServer"; - if (await customDescriptionService.InsertCustomDescriptionAsync(customDescription)) + if (await CustomDescriptionService.InsertCustomDescriptionAsync(customDescription)) { - navigationManager.NavigateTo("CustomDescriptions/Index"); + NavigationManager.NavigateTo("CustomDescriptions/Index"); } } - void Cancel() => navigationManager.NavigateTo("CustomDescriptions/Index"); + void Cancel() => NavigationManager.NavigateTo("CustomDescriptions/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/CustomDescriptions/Delete.razor b/Gremlin_BlazorServer/Pages/CustomDescriptions/Delete.razor index b1411d4..23b9429 100644 --- a/Gremlin_BlazorServer/Pages/CustomDescriptions/Delete.razor +++ b/Gremlin_BlazorServer/Pages/CustomDescriptions/Delete.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject CustomDescriptionService customDescriptionService -@inject NavigationManager navigationManager +@inject CustomDescriptionService CustomDescriptionService +@inject NavigationManager NavigationManager

Delete Employee


@@ -47,20 +47,20 @@ @code { [Parameter] - public string customDescriptionId { get; set; } = string.Empty; + public string CustomDescriptionId { get; set; } = string.Empty; CustomDescription customDescription = new CustomDescription(); protected override async Task OnInitializedAsync() { - customDescription = await Task.Run(() => customDescriptionService.GetCustomDescriptionAsync(Convert.ToUInt32(customDescriptionId))); + customDescription = await Task.Run(() => CustomDescriptionService.GetCustomDescriptionAsync(Convert.ToUInt32(CustomDescriptionId))); } protected async void DeleteCustomDescription() { - await customDescriptionService.DeleteCustomDescriptionAsync(customDescription); - navigationManager.NavigateTo("CustomDescriptions/Index"); + await CustomDescriptionService.DeleteCustomDescriptionAsync(customDescription); + NavigationManager.NavigateTo("CustomDescriptions/Index"); } void Cancel() { - navigationManager.NavigateTo("CustomDescriptions/Index"); + NavigationManager.NavigateTo("CustomDescriptions/Index"); } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/CustomDescriptions/Edit.razor b/Gremlin_BlazorServer/Pages/CustomDescriptions/Edit.razor index 2a604f4..b671d89 100644 --- a/Gremlin_BlazorServer/Pages/CustomDescriptions/Edit.razor +++ b/Gremlin_BlazorServer/Pages/CustomDescriptions/Edit.razor @@ -3,8 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject CustomDescriptionService customDescriptionservice -@inject NavigationManager navigationManager +@inject CustomDescriptionService CustomDescriptionservice +@inject NavigationManager NavigationManager

Edit CustomDescription


@@ -47,12 +47,12 @@ @code { [Parameter] - public string? customDescriptionId { get; set; } + public string? CustomDescriptionId { get; set; } CustomDescription customDescription = new CustomDescription(); protected override async Task OnInitializedAsync() { - customDescription = await Task.Run(() => customDescriptionservice.GetCustomDescriptionAsync(Convert.ToUInt32(customDescriptionId))); + customDescription = await Task.Run(() => CustomDescriptionservice.GetCustomDescriptionAsync(Convert.ToUInt32(CustomDescriptionId))); } protected async void UpdateCustomDescription() @@ -60,9 +60,9 @@ customDescription.DataModificationByUser = "Gremlin_BlazorServer"; customDescription.DataModificationDate = DateTime.Now; customDescription.DataVersionNumber++; - await customDescriptionservice.UpdateCustomDescriptionAsync(customDescription); - navigationManager.NavigateTo("CustomDescriptions/Index"); + await CustomDescriptionservice.UpdateCustomDescriptionAsync(customDescription); + NavigationManager.NavigateTo("CustomDescriptions/Index"); } - void Cancel() => navigationManager.NavigateTo("CustomDescriptions/Index"); + void Cancel() => NavigationManager.NavigateTo("CustomDescriptions/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/CustomDescriptions/Index.razor b/Gremlin_BlazorServer/Pages/CustomDescriptions/Index.razor index b85ecc2..fbe64df 100644 --- a/Gremlin_BlazorServer/Pages/CustomDescriptions/Index.razor +++ b/Gremlin_BlazorServer/Pages/CustomDescriptions/Index.razor @@ -3,13 +3,13 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject CustomDescriptionService customDescriptionservice +@inject CustomDescriptionService CustomDescriptionservice

CustomDescriptions

@@ -62,18 +62,18 @@ else @code { - public string searchCustomDescription = ""; + public string SearchCustomDescription = ""; List allCustomDescriptions = new(); List filteredCustomDescriptions = new(); protected override async Task OnInitializedAsync() { - allCustomDescriptions = await Task.Run(() => customDescriptionservice.GetAllCustomDescriptionsAsync()); + allCustomDescriptions = await Task.Run(() => CustomDescriptionservice.GetAllCustomDescriptionsAsync()); filteredCustomDescriptions = allCustomDescriptions; } private void SearchCustomDescription_OnChange() { - filteredCustomDescriptions = allCustomDescriptions.Where(cD => cD.ProductNumber.ToLower().Contains(searchCustomDescription.ToLower())).ToList(); + filteredCustomDescriptions = allCustomDescriptions.Where(cD => cD.ProductNumber.ToLower().Contains(SearchCustomDescription.ToLower())).ToList(); } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Index.razor b/Gremlin_BlazorServer/Pages/Index.razor index 88c6df9..8113de7 100644 --- a/Gremlin_BlazorServer/Pages/Index.razor +++ b/Gremlin_BlazorServer/Pages/Index.razor @@ -2,7 +2,7 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject LoginService loginService +@inject LoginService LoginService Gremlin BlazorServer @@ -22,7 +22,7 @@ @code { - private RegisteredUser registeredUser = new(); + private readonly RegisteredUser registeredUser = new(); private bool IsAuthenticated { get; set; } //protected async override Task OnInitializedAsync() diff --git a/Gremlin_BlazorServer/Pages/LineItems/Index.razor b/Gremlin_BlazorServer/Pages/LineItems/Index.razor index ab7a335..e980988 100644 --- a/Gremlin_BlazorServer/Pages/LineItems/Index.razor +++ b/Gremlin_BlazorServer/Pages/LineItems/Index.razor @@ -4,13 +4,13 @@ @using Gremlin_BlazorServer.Services; @using System.Globalization; -@inject LineItemService lineItemservice +@inject LineItemService LineItemservice

LineItems

@@ -53,32 +53,32 @@ else - @foreach (LineItem LineItem in filteredLineItems) + @foreach (LineItem lineItem in filteredLineItems) { - @LineItem.LineItemId - @LineItem.QuoteId - @LineItem.Position - @LineItem.Amount - @LineItem.ProductNumber - @LineItem.OptionNumber - @LineItem.SapShortDescription - @LineItem.SapLongDescription - @LineItem.ProductLine - @LineItem.TotalDiscount - @LineItem.SalesDiscount - @LineItem.SalesDiscount - @LineItem.PromotionalDiscount - @LineItem.ContractualDiscount - @LineItem.DemoDiscount - @LineItem.ListPrice.ToString("C", cultureInfo) - @LineItem.ExtendedListPrice.ToString("C", cultureInfo) - @LineItem.NetPrice.ToString("C", cultureInfo) - @LineItem.Total.ToString("C", cultureInfo) + @lineItem.LineItemId + @lineItem.QuoteId + @lineItem.Position + @lineItem.Amount + @lineItem.ProductNumber + @lineItem.OptionNumber + @lineItem.SapShortDescription + @lineItem.SapLongDescription + @lineItem.ProductLine + @lineItem.TotalDiscount + @lineItem.SalesDiscount + @lineItem.SalesDiscount + @lineItem.PromotionalDiscount + @lineItem.ContractualDiscount + @lineItem.DemoDiscount + @lineItem.ListPrice.ToString("C", cultureInfo) + @lineItem.ExtendedListPrice.ToString("C", cultureInfo) + @lineItem.NetPrice.ToString("C", cultureInfo) + @lineItem.Total.ToString("C", cultureInfo) -
+ - + @@ -90,19 +90,19 @@ else @code { - public string searchLineItem = ""; + public string SearchLineItem = ""; List allLineItems = new(); List filteredLineItems = new(); CultureInfo cultureInfo = new("de-DE"); protected override async Task OnInitializedAsync() { - allLineItems = await Task.Run(() => lineItemservice.GetLineItemsAsync()); + allLineItems = await Task.Run(() => LineItemservice.GetLineItemsAsync()); filteredLineItems = allLineItems; } private void SearchLineItem_OnChange() { - filteredLineItems = allLineItems.Where(cD => cD.ProductNumber!.ToLower().Contains(searchLineItem.ToLower())).ToList(); + filteredLineItems = allLineItems.Where(cD => cD.ProductNumber!.ToLower().Contains(SearchLineItem.ToLower())).ToList(); } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Login.razor b/Gremlin_BlazorServer/Pages/Login.razor index d335c66..dd02e3c 100644 --- a/Gremlin_BlazorServer/Pages/Login.razor +++ b/Gremlin_BlazorServer/Pages/Login.razor @@ -3,7 +3,7 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; -@inject LoginService loginService +@inject LoginService LoginService

Login

@@ -95,12 +95,12 @@ Validations loginValidationsRef = new(); Validations registerValidationsRef = new(); - private RegisteredUser registeredUser = new(); + private readonly RegisteredUser registeredUser = new(); private string selectedTab = "login"; private string userName = ""; private string password = ""; - private bool rememberMe = false; + private bool rememberMe; private Task OnSelectedTabChanged(string name) { @@ -119,7 +119,7 @@ PasswordHash = password }; - bool IsValidated = await Task.Run(() => loginService.ValidateUserAsync(registeredUser)); + await Task.Run(() => LoginService.ValidateUserAsync(registeredUser)); await loginValidationsRef.ClearAll(); } } @@ -131,7 +131,7 @@ registeredUser.UserName = userName; registeredUser.PasswordHash = password; - _ = await Task.Run(() => loginService.InsertRegisteredUserAsync(registeredUser)); + _ = await Task.Run(() => LoginService.InsertRegisteredUserAsync(registeredUser)); await registerValidationsRef.ClearAll(); } diff --git a/Gremlin_BlazorServer/Pages/ProductLines/Index.razor b/Gremlin_BlazorServer/Pages/ProductLines/Index.razor index c7f2043..fe3999f 100644 --- a/Gremlin_BlazorServer/Pages/ProductLines/Index.razor +++ b/Gremlin_BlazorServer/Pages/ProductLines/Index.razor @@ -5,7 +5,7 @@ @using System.Globalization; @using System.Diagnostics; -@inject ProductLineService productLineService +@inject ProductLineService ProductLineService

ProductLines

@@ -38,7 +38,7 @@ else } @code { - public string searchProductLine = ""; + public string SearchProductLine = ""; CultureInfo cultureInfo = new("de-DE"); ProductLine selectedProductLine = new(); @@ -46,7 +46,7 @@ else protected override async Task OnParametersSetAsync() { - productLines = await Task.Run(() => productLineService.GetAllProductLinesAsync()); + productLines = await Task.Run(() => ProductLineService.GetAllProductLinesAsync()); selectedProductLine = productLines.FirstOrDefault()!; } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Products/Index.razor b/Gremlin_BlazorServer/Pages/Products/Index.razor index f954e35..3f1f63b 100644 --- a/Gremlin_BlazorServer/Pages/Products/Index.razor +++ b/Gremlin_BlazorServer/Pages/Products/Index.razor @@ -5,7 +5,7 @@ @using System.Globalization; @using System.Diagnostics; -@inject ProductService productService +@inject ProductService ProductService

Products

@@ -43,7 +43,7 @@ else } @code { - public string searchProduct = ""; + public string SearchProduct = ""; CultureInfo cultureInfo = new("de-DE"); Product selectedProduct = new(); @@ -51,7 +51,7 @@ else protected override async Task OnParametersSetAsync() { - products = await Task.Run(() => productService.GetAllProductsAsync()); + products = await Task.Run(() => ProductService.GetAllProductsAsync()); selectedProduct = products.FirstOrDefault()!; } diff --git a/Gremlin_BlazorServer/Pages/Quotes/Add.razor b/Gremlin_BlazorServer/Pages/Quotes/Add.razor index 0b94d48..4497c66 100644 --- a/Gremlin_BlazorServer/Pages/Quotes/Add.razor +++ b/Gremlin_BlazorServer/Pages/Quotes/Add.razor @@ -7,12 +7,12 @@ @using System.Text; @using System.Globalization; -@inject QuoteService quoteService -@inject ContactService contactService -@inject AccountService accountService -@inject NavigationManager navigationManager -@inject ClipboardService clipboardService -@inject IJSRuntime JSRuntime +@inject QuoteService QuoteService +@inject ContactService ContactService +@inject AccountService AccountService +@inject NavigationManager NavigationManager +@inject ClipboardService ClipboardService +@inject IJSRuntime JsRuntime

Create New Quote


@@ -27,7 +27,7 @@ - + @@ -40,7 +40,7 @@ Angebotspfad:@quote.Path Gewährleistung (Monate):@quote.Warranty Angebotsgültigkeit (Tage): - Mehrwertsteuer (%): + Mehrwertsteuer (%): Versandkosten (%): @@ -57,7 +57,7 @@ Summe netto: Versandkosten: Gesamtsumme netto: - Mehrwertsteuer: + Mehrwertsteuer: Gesamtsumme brutto: @@ -99,11 +99,11 @@ protected override async Task OnInitializedAsync() { - contacts = await contactService.GetAllContactsAsync(); + contacts = await ContactService.GetAllContactsAsync(); await OnSelectedRowChanged(contacts.FirstOrDefault() ?? new()); - Contact salesRep = await contactService.GetContactAsync("Woitschetzki"); - quote = new(salesRep, true); + Contact salesRep = await ContactService.GetContactAsync("Woitschetzki"); + quote = new(salesRep); quote.Description = "HPLC"; await base.OnInitializedAsync(); @@ -115,23 +115,19 @@ { foreach (var file in e.Files) { - using (MemoryStream stream = new()) - { - await file.WriteToStreamAsync(stream); - stream.Seek(0, SeekOrigin.Begin); - using (StreamReader reader = new(stream)) - { - string fileContent = await reader.ReadToEndAsync(); - quote = quoteService.ReadLineItems(quote, fileContent); - quote.Path = $"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}Quotes{Path.DirectorySeparatorChar}{quote.Recipient.Account.AccountName}{Path.DirectorySeparatorChar}{DateTime.Today.Year}-{quote.Recipient.LastName}-{quote.Description}"; - - FileService.WriteClipboardToTSV(fileContent, quote); - } - } + using MemoryStream stream = new(); + await file.WriteToStreamAsync(stream); + stream.Seek(0, SeekOrigin.Begin); + using StreamReader reader = new(stream); + string fileContent = await reader.ReadToEndAsync(); + quote = QuoteService.ReadLineItems(quote, fileContent); + quote.Path = $"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}Quotes{Path.DirectorySeparatorChar}{quote.Recipient.Account.AccountName}{Path.DirectorySeparatorChar}{DateTime.Today.Year}-{quote.Recipient.LastName}-{quote.Description}"; + + FileService.WriteClipboardToTsv(fileContent, quote); } } catch (Exception exc) { Console.WriteLine(exc.Message); } - finally { this.StateHasChanged(); } + finally { StateHasChanged(); } } private void SelectQuoteOnWritten(FileWrittenEventArgs e) => Console.WriteLine($"File: {e.File.Name} Position: {e.Position} Data: {Convert.ToBase64String(e.Data)}"); @@ -142,28 +138,28 @@ { selectedRecipient = contact; quote.Recipient = contact; - correspondingAccount = await accountService.GetAccountAsync(contact.AccountId) ?? new Account(); + correspondingAccount = await AccountService.GetAccountAsync(contact.AccountId) ?? new Account(); } protected async void OnSave() { quote.DataModificationByUser = "Gremlin_BlazorServer"; - if (await quoteService.InsertQuoteAsync(quote)) + if (await QuoteService.InsertQuoteAsync(quote)) { - navigationManager.NavigateTo("Quotes/Index"); + NavigationManager.NavigateTo("Quotes/Index"); } } protected async void OnCreateTex() { - StringBuilder texStringBuilder = await quoteService.CreateTex(quote); + StringBuilder texStringBuilder = await QuoteService.CreateTex(quote); quote.Tex = texStringBuilder.ToString(); FileService.WriteTexFile(quote); } - protected void OnCreatePdf() => PdfService.CreatePDF(quote); + protected void OnCreatePdf() => PdfService.CreatePdf(quote); - protected void OnOpenPdf() => PdfService.OpenPDF(quote); + protected void OnOpenPdf() => PdfService.OpenPdf(quote); private Task OnDescriptionChanged(string value) { @@ -185,7 +181,7 @@ private Task OnVATChanged(string value) { - quote.VAT = float.Parse(value); + quote.Vat = float.Parse(value); return Task.CompletedTask; } @@ -213,5 +209,5 @@ return Task.CompletedTask; } - void OnCancel() => navigationManager.NavigateTo("Quotes/Index"); + void OnCancel() => NavigationManager.NavigateTo("Quotes/Index"); } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Pages/Quotes/Index.razor b/Gremlin_BlazorServer/Pages/Quotes/Index.razor index bfb02c8..f81c0ab 100644 --- a/Gremlin_BlazorServer/Pages/Quotes/Index.razor +++ b/Gremlin_BlazorServer/Pages/Quotes/Index.razor @@ -3,9 +3,8 @@ @using Gremlin_BlazorServer.Data.EntityClasses; @using Gremlin_BlazorServer.Services; @using System.Globalization; -@using System.Diagnostics; -@inject QuoteService quoteService +@inject QuoteService QuoteService @@ -20,8 +19,8 @@ - - + + @@ -34,8 +33,8 @@ Angebotspfad:@selectedQuote.Path Gewährleistung (Monate):@selectedQuote.Warranty Angebotsgültigkeit (Tage): - Mehrwertsteuer (%): - Versandkosten (%): + Mehrwertsteuer (%): + Versandkosten (%): @@ -57,7 +56,7 @@ Summe netto: Versandkosten: Gesamtsumme netto: - Mehrwertsteuer: + Mehrwertsteuer: Gesamtsumme brutto: @@ -84,8 +83,8 @@ @code { - public string searchQuote = ""; - CultureInfo cultureInfo = new("de-DE"); + public string SearchQuote = ""; + readonly CultureInfo cultureInfo = new("de-DE"); Quote selectedQuote = new(); List lineItemsInSelectedQuote = new(); @@ -94,15 +93,15 @@ protected override async Task OnInitializedAsync() { - quotes = await Task.Run(() => quoteService.GetAllQuotesAsync()); + quotes = await Task.Run(() => QuoteService.GetAllQuotesAsync()); await OnSelectedQuoteChanged(quotes.LastOrDefault() ?? new()); await base.OnInitializedAsync(); } - private async Task OnSelectedQuoteChanged(Quote selectedQuote) + private async Task OnSelectedQuoteChanged(Quote _selectedQuote) { - lineItemsInSelectedQuote = await quoteService.GetLineItemsAsync(selectedQuote); - this.selectedQuote = selectedQuote; + lineItemsInSelectedQuote = await QuoteService.GetLineItemsAsync(_selectedQuote); + this.selectedQuote = _selectedQuote; } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Services/AccountTypeService.cs b/Gremlin_BlazorServer/Services/AccountTypeService.cs index dbd58b4..b3d6713 100644 --- a/Gremlin_BlazorServer/Services/AccountTypeService.cs +++ b/Gremlin_BlazorServer/Services/AccountTypeService.cs @@ -31,19 +31,19 @@ namespace Gremlin_BlazorServer.Services public async Task GetAccountTypeAsync(string accountTypeCode) { - return await gremlinContext.AccountTypes.FirstOrDefaultAsync(AccountType => AccountType.AccountTypeCode.Equals(accountTypeCode)); + return await gremlinContext.AccountTypes.FirstOrDefaultAsync(accountType => accountType.AccountTypeCode.Equals(accountTypeCode)); } - public async Task UpdateAccountTypeAsync(AccountType AccountType) + public async Task UpdateAccountTypeAsync(AccountType accountType) { - _ = gremlinContext.AccountTypes.Update(AccountType); + _ = gremlinContext.AccountTypes.Update(accountType); _ = await gremlinContext.SaveChangesAsync(); return true; } - public async Task DeleteAccountTypeAsync(AccountType AccountType) + public async Task DeleteAccountTypeAsync(AccountType accountType) { - _ = gremlinContext.Remove(AccountType); + _ = gremlinContext.Remove(accountType); _ = await gremlinContext.SaveChangesAsync(); return true; } diff --git a/Gremlin_BlazorServer/Services/ContactService.cs b/Gremlin_BlazorServer/Services/ContactService.cs index a417fd1..c23f64f 100644 --- a/Gremlin_BlazorServer/Services/ContactService.cs +++ b/Gremlin_BlazorServer/Services/ContactService.cs @@ -1,25 +1,24 @@ using Gremlin_BlazorServer.Data.DBClasses; using Gremlin_BlazorServer.Data.EntityClasses; using Microsoft.EntityFrameworkCore; -using Microsoft.VisualStudio.Web.CodeGenerators.Mvc.Controller; using System.Diagnostics; namespace Gremlin_BlazorServer.Services { public class ContactService { - private static GremlinContext gremlinContext = new(); - private readonly AccountService accountService = new(gremlinContext); - private readonly AccountTypeService accountTypeService = new(gremlinContext); + private static GremlinContext _gremlinContext = new(); + private readonly AccountService accountService = new(_gremlinContext); + private readonly AccountTypeService accountTypeService = new(_gremlinContext); - public ContactService(GremlinContext gC) => gremlinContext = gC; + public ContactService(GremlinContext gC) => _gremlinContext = gC; public void ConfigureServices(IServiceCollection services) { _ = services.AddDbContext(ServiceLifetime.Scoped); } - public async Task> GetAllContactsAsync() => await gremlinContext.Contacts.Include(c => c.Account).ToListAsync(); + public async Task> GetAllContactsAsync() => await _gremlinContext.Contacts.Include(c => c.Account).ToListAsync(); public async Task InsertContactAsync(Contact contact) { @@ -27,8 +26,8 @@ namespace Gremlin_BlazorServer.Services contact.Account.AccountType = await accountTypeService.GetAccountTypeAsync("FPC") ?? new AccountType(); try { - _ = await gremlinContext.Contacts.AddAsync(contact); - _ = await gremlinContext.SaveChangesAsync(); + _ = await _gremlinContext.Contacts.AddAsync(contact); + _ = await _gremlinContext.SaveChangesAsync(); return true; } catch (Exception exception) @@ -40,27 +39,27 @@ namespace Gremlin_BlazorServer.Services public async Task GetContactAsync(uint contactId) { - Contact? contact = await gremlinContext.Contacts.FirstOrDefaultAsync(c => c.ContactId.Equals(contactId)); + Contact? contact = await _gremlinContext.Contacts.FirstOrDefaultAsync(c => c.ContactId.Equals(contactId)); return contact ?? new Contact(); } public async Task GetContactAsync(string lastName) { - Contact? contact = await gremlinContext.Contacts.FirstOrDefaultAsync(c => c.LastName.Equals(lastName)); + Contact? contact = await _gremlinContext.Contacts.FirstOrDefaultAsync(c => c.LastName.Equals(lastName)); return contact ?? new Contact(); } public async Task UpdateContactAsync(Contact contact) { - _ = gremlinContext.Contacts.Update(contact); - _ = await gremlinContext.SaveChangesAsync(); + _ = _gremlinContext.Contacts.Update(contact); + _ = await _gremlinContext.SaveChangesAsync(); return true; } public async Task DeleteContactAsync(Contact contact) { - _ = gremlinContext.Remove(contact); - _ = await gremlinContext.SaveChangesAsync(); + _ = _gremlinContext.Remove(contact); + _ = await _gremlinContext.SaveChangesAsync(); return true; } } diff --git a/Gremlin_BlazorServer/Services/CustomDescriptionService.cs b/Gremlin_BlazorServer/Services/CustomDescriptionService.cs index 6b16895..649717c 100644 --- a/Gremlin_BlazorServer/Services/CustomDescriptionService.cs +++ b/Gremlin_BlazorServer/Services/CustomDescriptionService.cs @@ -1,6 +1,5 @@ using Gremlin_BlazorServer.Data.DBClasses; using Gremlin_BlazorServer.Data.EntityClasses; -using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; using System.Diagnostics; diff --git a/Gremlin_BlazorServer/Services/FileService.cs b/Gremlin_BlazorServer/Services/FileService.cs index 27b5cc6..e94d488 100644 --- a/Gremlin_BlazorServer/Services/FileService.cs +++ b/Gremlin_BlazorServer/Services/FileService.cs @@ -20,14 +20,11 @@ namespace Gremlin_BlazorServer.Services ? name : assembly.GetManifestResourceNames().Single(str => str.EndsWith(name)); - using (Stream? stream = assembly.GetManifestResourceStream(resourcePath)) - { - if (stream == null) { return ""; } - using (StreamReader reader = new(stream)) - { - return reader.ReadToEnd(); - } - } + using Stream? stream = assembly.GetManifestResourceStream(resourcePath); + if (stream == null) { return ""; } + + using StreamReader reader = new(stream); + return reader.ReadToEnd(); } // public static string GetFilepathFromUser(string filter = "Delimited Data File|*.csv; *.txt; *.tsv") @@ -62,15 +59,13 @@ namespace Gremlin_BlazorServer.Services public static Encoding GetEncoding(string fileName) { Stream fileStream = File.OpenRead(fileName); - using (StreamReader reader = new(fileStream, defaultEncodingIfNoBom, true)) - { - _ = reader.Peek(); - Encoding encoding = reader.CurrentEncoding; - return encoding; - } + using StreamReader reader = new(fileStream, defaultEncodingIfNoBom, true); + _ = reader.Peek(); + Encoding encoding = reader.CurrentEncoding; + return encoding; } - public static void WriteClipboardToTSV(string clipboard, Quote quote) + public static void WriteClipboardToTsv(string clipboard, Quote quote) { string datei = $"{quote.Path}{Path.DirectorySeparatorChar}{quote.QuotationNumber}.tsv"; FileInfo fileInfo = new(datei); diff --git a/Gremlin_BlazorServer/Services/LineItemService.cs b/Gremlin_BlazorServer/Services/LineItemService.cs index 9bf32cb..dab4537 100644 --- a/Gremlin_BlazorServer/Services/LineItemService.cs +++ b/Gremlin_BlazorServer/Services/LineItemService.cs @@ -35,19 +35,19 @@ namespace Gremlin_BlazorServer.Services public async Task GetLineItemAsync(uint lineItemId) { - return await gremlinContext.LineItems.FirstOrDefaultAsync(LineItem => LineItem.LineItemId.Equals(lineItemId)); + return await gremlinContext.LineItems.FirstOrDefaultAsync(lineItem => lineItem.LineItemId.Equals(lineItemId)); } - public async Task UpdateLineItemAsync(LineItem LineItem) + public async Task UpdateLineItemAsync(LineItem lineItem) { - _ = gremlinContext.LineItems.Update(LineItem); + _ = gremlinContext.LineItems.Update(lineItem); _ = await gremlinContext.SaveChangesAsync(); return true; } - public async Task DeleteLineItemAsync(LineItem LineItem) + public async Task DeleteLineItemAsync(LineItem lineItem) { - _ = gremlinContext.Remove(LineItem); + _ = gremlinContext.Remove(lineItem); _ = await gremlinContext.SaveChangesAsync(); return true; } diff --git a/Gremlin_BlazorServer/Services/LoginService.cs b/Gremlin_BlazorServer/Services/LoginService.cs index 664a5da..0a11b86 100644 --- a/Gremlin_BlazorServer/Services/LoginService.cs +++ b/Gremlin_BlazorServer/Services/LoginService.cs @@ -4,62 +4,61 @@ using Microsoft.AspNetCore.Components.Authorization; using Microsoft.EntityFrameworkCore; using System.Diagnostics; -namespace Gremlin_BlazorServer.Services -{ - public class LoginService - { - private readonly GremlinContext gremlinContext; +namespace Gremlin_BlazorServer.Services; - public LoginService(GremlinContext gC) => gremlinContext = gC; - - private Task AuthenticationStateTask { get; set; } = default!; +public class LoginService +{ + private readonly GremlinContext gremlinContext; - public void ConfigureServices(IServiceCollection services) - { - _ = services.AddDbContext(ServiceLifetime.Scoped); - } + public LoginService(GremlinContext gC) => gremlinContext = gC; - public async Task> GetAllRegisteredUserAsync() => await gremlinContext.RegisteredUser.ToListAsync(); + private Task AuthenticationStateTask { get; set; } = default!; - public async Task InsertRegisteredUserAsync(RegisteredUser registeredUser) - { - try - { - _ = await gremlinContext.RegisteredUser.AddAsync(registeredUser); - _ = await gremlinContext.SaveChangesAsync(); - return true; - } - catch (Exception exception) - { - Debug.WriteLine(exception.Message); - return false; - } - } + public void ConfigureServices(IServiceCollection services) + { + _ = services.AddDbContext(ServiceLifetime.Scoped); + } - public async Task GetRegisteredUserAsync(string registeredUserName) - { - return await gremlinContext.RegisteredUser.FirstOrDefaultAsync(rU => rU.UserName.Equals(registeredUserName)!); - } + public async Task> GetAllRegisteredUserAsync() => await gremlinContext.RegisteredUser.ToListAsync(); - public async Task UpdateRegisteredUserAsync(RegisteredUser registeredUser) + public async Task InsertRegisteredUserAsync(RegisteredUser registeredUser) + { + try { - _ = gremlinContext.RegisteredUser.Update(registeredUser); + _ = await gremlinContext.RegisteredUser.AddAsync(registeredUser); _ = await gremlinContext.SaveChangesAsync(); return true; } - - public async Task DeleteRegisteredUserAsync(RegisteredUser registeredUser) + catch (Exception exception) { - _ = gremlinContext.Remove(registeredUser); - _ = await gremlinContext.SaveChangesAsync(); - return true; + Debug.WriteLine(exception.Message); + return false; } + } - public async Task ValidateUserAsync(RegisteredUser registeredUser) - { - _ = await Task.Run(() => GetRegisteredUserAsync(registeredUser.UserName)); - AuthenticationState authState = await AuthenticationStateTask; - return authState.User.Identity != null ? authState.User.Identity.IsAuthenticated : false; - } + private async Task GetRegisteredUserAsync(string registeredUserName) + { + return await gremlinContext.RegisteredUser.FirstOrDefaultAsync(rU => rU.UserName.Equals(registeredUserName)); + } + + public async Task UpdateRegisteredUserAsync(RegisteredUser registeredUser) + { + _ = gremlinContext.RegisteredUser.Update(registeredUser); + _ = await gremlinContext.SaveChangesAsync(); + return true; + } + + public async Task DeleteRegisteredUserAsync(RegisteredUser registeredUser) + { + _ = gremlinContext.Remove(registeredUser); + _ = await gremlinContext.SaveChangesAsync(); + return true; + } + + public async Task ValidateUserAsync(RegisteredUser registeredUser) + { + _ = await Task.Run(() => GetRegisteredUserAsync(registeredUser.UserName)); + AuthenticationState authState = await AuthenticationStateTask; + return authState.User.Identity is { IsAuthenticated: true }; } } \ No newline at end of file diff --git a/Gremlin_BlazorServer/Services/PdfService.cs b/Gremlin_BlazorServer/Services/PdfService.cs index 17a5e1a..f27f12b 100644 --- a/Gremlin_BlazorServer/Services/PdfService.cs +++ b/Gremlin_BlazorServer/Services/PdfService.cs @@ -3,12 +3,12 @@ using System.Diagnostics; namespace Gremlin_BlazorServer.Services { - internal class PdfService + internal abstract class PdfService { private static readonly string agilentLogo = $"Quotes{Path.DirectorySeparatorChar}agilentLogo.png"; private static readonly string signWoitschetzki = $"Quotes{Path.DirectorySeparatorChar}signWoitschetzki.png"; - public static bool CreatePDF(Quote quote) + public static bool CreatePdf(Quote quote) { //Copy images to quotePath try @@ -17,7 +17,7 @@ namespace Gremlin_BlazorServer.Services File.Copy(signWoitschetzki, $"{quote.Path}{Path.DirectorySeparatorChar}signWoitschetzki.png"); //Create PDF twice - if (RunningPDFLaTeX(quote, 2)) + if (RunningPdfLaTeX(quote, 2)) { return RemoveTempFiles(quote.Path); } @@ -34,7 +34,7 @@ namespace Gremlin_BlazorServer.Services } } - public static bool RemoveTempFiles(string quotePath) + private static bool RemoveTempFiles(string quotePath) { DirectoryInfo directoryInfo = new(quotePath); foreach (FileInfo file in directoryInfo.EnumerateFiles()) @@ -48,37 +48,33 @@ namespace Gremlin_BlazorServer.Services return true; } - private static bool RunningPDFLaTeX(Quote quote, int runs) + private static bool RunningPdfLaTeX(Quote quote, int runs) { for (int i = 0; i < runs; i++) { - using (Process process = new()) - { - process.StartInfo.WorkingDirectory = quote.Path; - process.StartInfo.FileName = "pdflatex"; - process.StartInfo.Arguments = quote.QuotationNumber; - process.StartInfo.UseShellExecute = true; + using Process process = new(); + process.StartInfo.WorkingDirectory = quote.Path; + process.StartInfo.FileName = "pdflatex"; + process.StartInfo.Arguments = quote.QuotationNumber; + process.StartInfo.UseShellExecute = true; - try { process.Start(); } - catch (Exception ex) { Debug.WriteLine(ex); return false; } + try { process.Start(); } + catch (Exception ex) { Debug.WriteLine(ex); return false; } - process.WaitForExit(); - } + process.WaitForExit(); } return true; } - public static bool OpenPDF(Quote quote) + public static bool OpenPdf(Quote quote) { - using (Process process = new()) - { - process.StartInfo.WorkingDirectory = quote.Path; - process.StartInfo.FileName = "okular"; //@"C:\Program Files\Okular\bin\okular.exe"; - process.StartInfo.Arguments = $"{quote.QuotationNumber}.pdf"; + using Process process = new(); + process.StartInfo.WorkingDirectory = quote.Path; + process.StartInfo.FileName = "okular"; //@"C:\Program Files\Okular\bin\okular.exe"; + process.StartInfo.Arguments = $"{quote.QuotationNumber}.pdf"; - try { return process.Start(); } - catch (Exception ex) { Debug.WriteLine(ex); return false; } - } + try { return process.Start(); } + catch (Exception ex) { Debug.WriteLine(ex); return false; } } } } diff --git a/Gremlin_BlazorServer/Services/ProductLineService.cs b/Gremlin_BlazorServer/Services/ProductLineService.cs index 156ede7..36a5095 100644 --- a/Gremlin_BlazorServer/Services/ProductLineService.cs +++ b/Gremlin_BlazorServer/Services/ProductLineService.cs @@ -31,19 +31,19 @@ namespace Gremlin_BlazorServer.Services public async Task GetProductLineAsync(string productLineCode) { - return await gremlinContext.ProductLines.FirstOrDefaultAsync(ProductLine => ProductLine.ProductLineCode.Equals(productLineCode)); + return await gremlinContext.ProductLines.FirstOrDefaultAsync(productLine => productLine.ProductLineCode.Equals(productLineCode)); } - public async Task UpdateProductLineAsync(ProductLine ProductLine) + public async Task UpdateProductLineAsync(ProductLine productLine) { - _ = gremlinContext.ProductLines.Update(ProductLine); + _ = gremlinContext.ProductLines.Update(productLine); _ = await gremlinContext.SaveChangesAsync(); return true; } - public async Task DeleteProductLineAsync(ProductLine ProductLine) + public async Task DeleteProductLineAsync(ProductLine productLine) { - _ = gremlinContext.Remove(ProductLine); + _ = gremlinContext.Remove(productLine); _ = await gremlinContext.SaveChangesAsync(); return true; } diff --git a/Gremlin_BlazorServer/Services/ProductService.cs b/Gremlin_BlazorServer/Services/ProductService.cs index f3b97e8..0657ee8 100644 --- a/Gremlin_BlazorServer/Services/ProductService.cs +++ b/Gremlin_BlazorServer/Services/ProductService.cs @@ -14,11 +14,11 @@ namespace Gremlin_BlazorServer.Services public async Task> GetAllProductsAsync() => await gremlinContext.Products.ToListAsync(); - public async Task InsertProductAsync(Product Product) + public async Task InsertProductAsync(Product product) { try { - _ = await gremlinContext.Products.AddAsync(Product); + _ = await gremlinContext.Products.AddAsync(product); _ = await gremlinContext.SaveChangesAsync(); return true; } @@ -31,20 +31,20 @@ namespace Gremlin_BlazorServer.Services public async Task GetProductAsync(string productNumber) { - Product? Product = await gremlinContext.Products.FirstOrDefaultAsync(Product => Product.ProductNumber.Equals(productNumber)); - return Product; + Product? product = await gremlinContext.Products.FirstOrDefaultAsync(product => product.ProductNumber.Equals(productNumber)); + return product; } - public async Task UpdateProductAsync(Product Product) + public async Task UpdateProductAsync(Product product) { - _ = gremlinContext.Products.Update(Product); + _ = gremlinContext.Products.Update(product); _ = await gremlinContext.SaveChangesAsync(); return true; } - public async Task DeleteProductAsync(Product Product) + public async Task DeleteProductAsync(Product product) { - _ = gremlinContext.Remove(Product); + _ = gremlinContext.Remove(product); _ = await gremlinContext.SaveChangesAsync(); return true; } diff --git a/Gremlin_BlazorServer/Services/QuoteService.cs b/Gremlin_BlazorServer/Services/QuoteService.cs index 8b9a0ea..4546c54 100644 --- a/Gremlin_BlazorServer/Services/QuoteService.cs +++ b/Gremlin_BlazorServer/Services/QuoteService.cs @@ -9,23 +9,23 @@ namespace Gremlin_BlazorServer.Services { public class QuoteService { - private static GremlinContext gremlinContext = new(); - public QuoteService(GremlinContext gC) => gremlinContext = gC; + private static GremlinContext _gremlinContext = new(); + public QuoteService(GremlinContext gC) => _gremlinContext = gC; - private readonly TexService texService = new(gremlinContext); + private readonly TexService texService = new(_gremlinContext); public void ConfigureServices(IServiceCollection services) => services.AddDbContext(ServiceLifetime.Scoped); - public async Task> GetAllQuotesAsync() => await gremlinContext.Quotes.ToListAsync(); + public async Task> GetAllQuotesAsync() => await _gremlinContext.Quotes.ToListAsync(); - public async Task> GetLineItemsAsync(Quote quote) => await gremlinContext.LineItems.Where(lI => lI.QuoteId == quote.QuoteId).ToListAsync(); + public async Task> GetLineItemsAsync(Quote quote) => await _gremlinContext.LineItems.Where(lI => lI.QuoteId == quote.QuoteId).ToListAsync(); public async Task InsertQuoteAsync(Quote quote) { try { - _ = await gremlinContext.Quotes.AddAsync(quote); - _ = await gremlinContext.SaveChangesAsync(); + _ = await _gremlinContext.Quotes.AddAsync(quote); + _ = await _gremlinContext.SaveChangesAsync(); return true; } catch (Exception exception) @@ -35,19 +35,19 @@ namespace Gremlin_BlazorServer.Services } } - public async Task GetQuoteAsync(uint quoteId) => await gremlinContext.Quotes.FirstOrDefaultAsync(q => q.QuoteId.Equals(quoteId)) ?? new Quote(); + public async Task GetQuoteAsync(uint quoteId) => await _gremlinContext.Quotes.FirstOrDefaultAsync(q => q.QuoteId.Equals(quoteId)) ?? new Quote(); - public async Task UpdateQuoteAsync(Quote Quote) + public async Task UpdateQuoteAsync(Quote quote) { - _ = gremlinContext.Quotes.Update(Quote); - _ = await gremlinContext.SaveChangesAsync(); + _ = _gremlinContext.Quotes.Update(quote); + _ = await _gremlinContext.SaveChangesAsync(); return true; } - public async Task DeleteQuoteAsync(Quote Quote) + public async Task DeleteQuoteAsync(Quote quote) { - _ = gremlinContext.Remove(Quote); - _ = await gremlinContext.SaveChangesAsync(); + _ = _gremlinContext.Remove(quote); + _ = await _gremlinContext.SaveChangesAsync(); return true; } @@ -55,10 +55,7 @@ namespace Gremlin_BlazorServer.Services { StringBuilder texString = await texService.CreateTexAsync(quote); - if (texString.Length > 0) - Debug.WriteLine("Creating TexFile succesfully."); - else - Debug.WriteLine("Error during TexFile creation!"); + Debug.WriteLine(texString.Length > 0 ? "Creating TexFile succesfully." : "Error during TexFile creation!"); return texString; } @@ -73,8 +70,8 @@ namespace Gremlin_BlazorServer.Services quote.LineItems = ReadLineItemsFromClipboard(clipboard); - quote.QuoteContains3PP = DoesContains(quote, "3PP"); - quote.QuoteContainsRB = DoesContains(quote, "RB"); + quote.QuoteContains3Pp = DoesContains(quote, "3PP"); + quote.QuoteContainsRb = DoesContains(quote, "RB"); quote.TotalListprice = GetTotal(quote, "TotalListprice"); quote.TotalDiscount = GetTotal(quote, "AverageDiscount"); @@ -84,25 +81,22 @@ namespace Gremlin_BlazorServer.Services foreach (LineItem lineItem in quote.LineItems) { - if (lineItem.OptionNumber != null) + // normale Gewährleistungsverlängerung + if (lineItem.OptionNumber.StartsWith("8D")) { - // normale Gewährleistungsverlängerung - if (lineItem.OptionNumber.StartsWith("8D")) - { - quote.Warranty = int.Parse(lineItem.OptionNumber.Last().ToString()) * 12; - } + quote.Warranty = int.Parse(lineItem.OptionNumber.Last().ToString()) * 12; + } - //24 Monate Gewährleistung für Akademia - if (lineItem.OptionNumber == "9EC") - { - quote.Warranty = 24; - } + //24 Monate Gewährleistung für Akademia + if (lineItem.OptionNumber == "9EC") + { + quote.Warranty = 24; + } - //36 Monate Gewährleistung für Akademia - if (lineItem.OptionNumber == "9CC") - { - quote.Warranty = 36; - } + //36 Monate Gewährleistung für Akademia + if (lineItem.OptionNumber == "9CC") + { + quote.Warranty = 36; } //AddToTotal @@ -143,8 +137,6 @@ namespace Gremlin_BlazorServer.Services private static List ParseClipboardList(List lineItemStrings) { List lineItems = new(); - int countError = 0; - int countEmpty = 0; CultureInfo cultureInfoUs = new("en-US"); foreach (string[] lineItemString in lineItemStrings) @@ -155,7 +147,6 @@ namespace Gremlin_BlazorServer.Services //Header ignorieren if (lineItemString[0] == "#") { - countEmpty++; continue; } @@ -183,8 +174,6 @@ namespace Gremlin_BlazorServer.Services else { Debug.WriteLine("Angebot konnte nicht eingelesen werden!"); - countError++; - continue; } } return lineItems; @@ -192,8 +181,7 @@ namespace Gremlin_BlazorServer.Services private static byte CheckForAcademic(Contact recipient) { - if (recipient.Account.AccountType == null) { return 60; } - return (byte)(recipient == null || recipient.Account.AccountType.AccountTypeCode == null ? 0 : recipient.Account.AccountType.AccountTypeCode.StartsWith("N") ? 90 : 60); + return (byte)(recipient.Account.AccountType.AccountTypeCode.StartsWith("N") ? 90 : 60); } private static decimal GetFreight(decimal net, decimal freight) @@ -206,8 +194,8 @@ namespace Gremlin_BlazorServer.Services { quote.TotalFreightOnly = GetFreight(quote.TotalNet, quote.Freight); quote.TotalFreight = quote.TotalNet + quote.TotalFreightOnly; - quote.TotalVAT = quote.TotalFreight * Convert.ToDecimal(quote.VAT) / 100; - quote.TotalGross = quote.TotalFreight * (100 + Convert.ToDecimal(quote.VAT)) / 100; + quote.TotalVat = quote.TotalFreight * Convert.ToDecimal(quote.Vat) / 100; + quote.TotalGross = quote.TotalFreight * (100 + Convert.ToDecimal(quote.Vat)) / 100; return quote; } @@ -217,7 +205,7 @@ namespace Gremlin_BlazorServer.Services quote.TotalNet = 0; quote.TotalFreightOnly = 0; quote.TotalFreight = 0; - quote.TotalVAT = 0; + quote.TotalVat = 0; quote.TotalGross = 0; return quote; @@ -243,7 +231,7 @@ namespace Gremlin_BlazorServer.Services } } - if (type == "AverageDiscount" & quote.LineItems.Count != 0) { total /= quote.LineItems.Count; } + if ((type == "AverageDiscount") & (quote.LineItems.Count != 0)) { total /= quote.LineItems.Count; } return total; } @@ -262,7 +250,7 @@ namespace Gremlin_BlazorServer.Services } break; case "RB": - if (lineItem.ProductLine == "RB" & lineItem.ProductNumber != "R2005A") + if ((lineItem.ProductLine == "RB") & (lineItem.ProductNumber != "R2005A")) { Debug.WriteLine($"Quote containts RB with ProductNumber {lineItem.ProductNumber}"); return true; diff --git a/Gremlin_BlazorServer/Services/TexService.cs b/Gremlin_BlazorServer/Services/TexService.cs index 7134dcb..a618765 100644 --- a/Gremlin_BlazorServer/Services/TexService.cs +++ b/Gremlin_BlazorServer/Services/TexService.cs @@ -1,6 +1,5 @@ using Gremlin_BlazorServer.Data.DBClasses; using Gremlin_BlazorServer.Data.EntityClasses; -using Microsoft.JSInterop; using System.Text; using static Gremlin_BlazorServer.Data.EntityClasses.Enums; @@ -8,11 +7,11 @@ namespace Gremlin_BlazorServer.Services { public class TexService { - private static GremlinContext gremlinContext = new(); - public TexService(GremlinContext gC) => gremlinContext = gC; + private static GremlinContext _gremlinContext = new(); + public TexService(GremlinContext gC) => _gremlinContext = gC; - private readonly AccountService accountService = new(gremlinContext); - private readonly CustomDescriptionService customDescriptionService = new(gremlinContext); + private readonly AccountService accountService = new(_gremlinContext); + private readonly CustomDescriptionService customDescriptionService = new(_gremlinContext); public async Task CreateTexAsync(Quote quote) { @@ -21,11 +20,11 @@ namespace Gremlin_BlazorServer.Services return new StringBuilder(correctedTex); } - public async Task CreateBriefkopfAsync(Contact contact, bool tex = false) + private async Task CreateBriefkopfAsync(Contact contact, bool tex = false) { StringBuilder briefkopf = new(); - _ = contact.Gender == (byte)Enums.Gender.Male + _ = contact.Gender == (byte)Gender.Male ? briefkopf.AppendLine($"Herr {contact.FirstName} {contact.LastName}") : briefkopf.AppendLine($"Frau {contact.FirstName} {contact.LastName}"); if (tex) @@ -56,7 +55,7 @@ namespace Gremlin_BlazorServer.Services _ = briefkopf.AppendLine($"{account.Street}"); if (tex) { _ = briefkopf.AppendLine($"\\\\"); } - _ = briefkopf.AppendLine($"{account.ZIP} {account.City}"); + _ = briefkopf.AppendLine($"{account.Zip} {account.City}"); if (tex) { _ = briefkopf.AppendLine($"\\\\"); } return briefkopf; @@ -64,7 +63,7 @@ namespace Gremlin_BlazorServer.Services private async Task CreateTexFileAsync(Quote quote) { - string rand = "2"; //RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "texRand"); + const string rand = "2"; //RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "texRand"); StringBuilder texFile = new($"\\documentclass[a4paper,ngerman,parskip,10pt]{{scrlttr2}}\n" + $"\\usepackage{{lmodern}}\n" @@ -117,28 +116,22 @@ namespace Gremlin_BlazorServer.Services _ = 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}\\\\"); - if (quote.Recipient != null) - { - _ = texFile.Append(await CreateBriefkopfAsync(quote.Recipient, true)); - } + _ = texFile.Append(await CreateBriefkopfAsync(quote.Recipient, true)); _ = texFile.AppendLine("&\\\\\n&\\\\\n\\end{tabular}\n\\vspace{1cm}\\par "); //Anrede - if (quote.Recipient != null) - { - _ = quote.Recipient.Gender == (byte)Gender.Male - ? texFile.AppendLine($"Sehr geehrter Herr {quote.Recipient.LastName},\\par ") - : texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par "); - } + _ = quote.Recipient.Gender == (byte)Gender.Male + ? texFile.AppendLine($"Sehr geehrter Herr {quote.Recipient.LastName},\\par ") + : texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par "); //Anschreiben _ = texFile.AppendLine(await CreateCoverletterAsync(quote)); //RB-Disclaimer - if (quote.QuoteContainsRB) + if (quote.QuoteContainsRb) { - _ = texFile.AppendLine(await CreateRBDisclaimerAsync(quote)); + _ = texFile.AppendLine(await CreateRbDisclaimerAsync(quote)); } //Tabelle @@ -172,29 +165,32 @@ namespace Gremlin_BlazorServer.Services string lineItemTex = ""; CustomDescription cD = await customDescriptionService.GetCustomDescriptionAsync(lI.ProductNumber, lI.OptionNumber); - if (quote.ShowSinglePrices == true) + switch (quote.ShowSinglePrices) { - if (!quote.ShowDiscounts) - { + case true when !quote.ShowDiscounts: //mit Einzelpreisen lineItemTex = lI.OptionNumber != "" - ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\" - : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"; - } - else if (quote.ShowDiscounts) - { - //mit Einzelpreisen und Discounts + ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\" + : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"; + break; + case true: + { + if (quote.ShowDiscounts) + { + //mit Einzelpreisen und Discounts + lineItemTex = lI.OptionNumber != "" + ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\" + : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"; + } + + break; + } + case false: + //ohne Einzelpreise lineItemTex = lI.OptionNumber != "" - ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\" - : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"; - } - } - else if (!quote.ShowSinglePrices) - { - //ohne Einzelpreise - lineItemTex = lI.OptionNumber != "" - ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\" - : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\"; + ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\" + : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\"; + break; } _ = texFile.Append(lineItemTex + "\n"); @@ -219,9 +215,9 @@ namespace Gremlin_BlazorServer.Services _ = texFile.AppendLine($"\\textbf{{Gesamtsumme netto}} & \\SI{{{quote.TotalFreight}}}{{\\sieuro}}\\\\"); //mit Mehrwertsteuer - if (quote.ShowBrutto == true) + if (quote.ShowBrutto) { - _ = texFile.AppendLine($"\\textbf{{Umsatzsteuer ({quote.VAT}\\%)}} & \\SI{{{quote.TotalVAT}}}{{\\sieuro}}\\\\"); + _ = texFile.AppendLine($"\\textbf{{Umsatzsteuer ({quote.Vat}\\%)}} & \\SI{{{quote.TotalVat}}}{{\\sieuro}}\\\\"); _ = texFile.AppendLine($"\\textbf{{Gesamtsumme brutto}} & \\SI{{{quote.TotalGross}}}{{\\sieuro}}\\\\"); } @@ -229,9 +225,9 @@ namespace Gremlin_BlazorServer.Services _ = texFile.AppendLine($"\\textbf{{Gewährleistung:}}\\\\\nDie Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt {quote.Warranty} Monate.\n"); //3PP-Disclaimer - if (quote.QuoteContains3PP) + if (quote.QuoteContains3Pp) { - _ = texFile.AppendLine(Create3PPDisclaimer(quote)); + _ = texFile.AppendLine(Create3PpDisclaimer(quote)); } _ = texFile.AppendLine($"\\textbf{{Hinweis:}}\\\\ \n" + @@ -244,40 +240,40 @@ namespace Gremlin_BlazorServer.Services return texFile; } - private async Task CreateRBDisclaimerAsync(Quote quote) + private async Task CreateRbDisclaimerAsync(Quote quote) { Random r = new(); string rbDisclaimer = "\\textbf{Wichtiger Hinweis zur Bestellung von überholten Geräten}\\\\\n"; rbDisclaimer += "Bitte beachten Sie, dass in der Regel nur wenige gebrauchte Geräte auf Lager sind und diese ohne die Möglichkeit einer Reservierung auf „first come, first serve“-Basis verkauft werden. Um lange Lieferzeiten zu vermeiden, sollte daher bei konkretem Interesse zunächst der Lagerstand überprüft werden. Die aktuellen Lagerbestände sind:\n"; - List lineItemsWithRB = quote.LineItems.Where(lI => lI.ProductLine == "RB").ToList(); + List lineItemsWithRb = quote.LineItems.Where(lI => lI.ProductLine == "RB").ToList(); rbDisclaimer += "\\begin{center}\n\\begin{tabular}{clc}\n"; rbDisclaimer += "\\textbf{Modul} & \\textbf{Beschreibung} &\\textbf{Bestand}\\\\ \\hline \n"; - foreach (LineItem lineItemWithRB in lineItemsWithRB) + foreach (LineItem lineItemWithRb in lineItemsWithRb) { - CustomDescription customDescription = await customDescriptionService.GetCustomDescriptionAsync(lineItemWithRB.ProductNumber, lineItemWithRB.OptionNumber); + CustomDescription customDescription = await customDescriptionService.GetCustomDescriptionAsync(lineItemWithRb.ProductNumber, lineItemWithRb.OptionNumber); int rbcount = r.Next(20) - 5; //Get count of RB? - rbDisclaimer += $"{lineItemWithRB.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n"; + rbDisclaimer += $"{lineItemWithRb.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n"; } rbDisclaimer += "\\end{tabular}\n\\end{center}\n"; return rbDisclaimer; } - private static string Create3PPDisclaimer(Quote quote) + private static string Create3PpDisclaimer(Quote quote) { string dreipp = "\\textbf{Hinweis zu Non-Agilent-Produkten}\\\\ \n" + $"Bitte beachten Sie, dass das/die o.g. Produkt/e "; //List all 3PP product numbers - List lineItemsWith3PP = quote.LineItems.Where(lI => lI.ProductLine == "3PP").ToList(); - for (int i = 0; i < lineItemsWith3PP.Count; i++) + List lineItemsWith3Pp = quote.LineItems.Where(lI => lI.ProductLine == "3PP").ToList(); + for (int i = 0; i < lineItemsWith3Pp.Count; i++) { - _ = i < lineItemsWith3PP.Count - 1 - ? dreipp += $"{lineItemsWith3PP[i].ProductNumber}, " - : dreipp += $"{lineItemsWith3PP[i].ProductNumber}"; + _ = i < lineItemsWith3Pp.Count - 1 + ? dreipp += $"{lineItemsWith3Pp[i].ProductNumber}, " + : dreipp += $"{lineItemsWith3Pp[i].ProductNumber}"; //Get all 3PP Supplier //List supllier3PP = lineItemWith3PP.ProductLine.Supplier; @@ -347,7 +343,7 @@ namespace Gremlin_BlazorServer.Services return coverLetter; } - public static string Replace(string text) + private static string Replace(string text) { if (text == "") { diff --git a/Gremlin_BlazorServer/Utilities/GUClasses/DataIdType.cs b/Gremlin_BlazorServer/Utilities/GUClasses/DataIdType.cs index 8942253..ab3debf 100644 --- a/Gremlin_BlazorServer/Utilities/GUClasses/DataIdType.cs +++ b/Gremlin_BlazorServer/Utilities/GUClasses/DataIdType.cs @@ -7,20 +7,20 @@ public string DataType { get; } public List Qualifiers { get; } - public int Score { get; private set; } = 0; - public bool AllQualifierMatched { get; private set; } = false; + public int Score { get; private set; } + public bool AllQualifierMatched { get; private set; } - public DataIdType(string DataType, IEnumerable Qualifiers) + public DataIdType(string dataType, IEnumerable qualifiers) { - this.DataType = DataType; - this.Qualifiers = Qualifiers.ToList(); - numberOfQualifiers = this.Qualifiers.Count; + DataType = dataType; + Qualifiers = qualifiers.ToList(); + numberOfQualifiers = Qualifiers.Count; matchedQualifiers = new(); } - public void AddFoundQualfier(string QualifierFound) + public void AddFoundQualfier(string qualifierFound) { - matchedQualifiers.Add(QualifierFound); + matchedQualifiers.Add(qualifierFound); Score++; AllQualifierMatched = matchedQualifiers.Count == numberOfQualifiers; } diff --git a/Gremlin_BlazorServer/Utilities/GUClasses/DataIdentificator.cs b/Gremlin_BlazorServer/Utilities/GUClasses/DataIdentificator.cs index 56ba37c..70113f5 100644 --- a/Gremlin_BlazorServer/Utilities/GUClasses/DataIdentificator.cs +++ b/Gremlin_BlazorServer/Utilities/GUClasses/DataIdentificator.cs @@ -5,49 +5,48 @@ namespace Gremlin_BlazorServer.Services.GUClasses internal class DataIdentificator { //private readonly string _source; //Qualifier-Liste - private readonly Dictionary _mappingTable; //Mapping Spaltenzahl <-> Property/(übersetzte) Spaltenüberschrift + private readonly Dictionary mappingTable; //Mapping Spaltenzahl <-> Property/(übersetzte) Spaltenüberschrift public List DataTypes { get; set; } = new List(); - public DataIdentificator(Dictionary MappingTable) + public DataIdentificator(Dictionary mappingTable) { - _mappingTable = MappingTable; + mappingTable = mappingTable; //DataTypes populieren. Dazu: einlesen, nach DT qualifier in temp. Liste speichern, damit neuen DIDT erzeugen und zur Liste hinzufügen Initialize(); } private void Initialize() { - string _currentDataType; + string currentDataType; DataTypes = new(); List dataIdentifier = ReadDataIdentifierFromFile(); - _currentDataType = dataIdentifier[0].DataType; - List _identifierOfCurrentType = new(); + currentDataType = dataIdentifier[0].DataType; + List identifierOfCurrentType = new(); foreach (DataIdentifier qualifier in dataIdentifier) { - if (qualifier.DataType == _currentDataType) + if (qualifier.DataType == currentDataType) { - _identifierOfCurrentType.Add(qualifier.Identifier); + identifierOfCurrentType.Add(qualifier.Identifier); if (qualifier == dataIdentifier[^1]) //letztes Element der Liste { - DataIdType typeToBeAdded = new(_currentDataType, _identifierOfCurrentType); + DataIdType typeToBeAdded = new(currentDataType, identifierOfCurrentType); DataTypes.Add(typeToBeAdded); //_currentDataType = qualifier.DataType; } - continue; } else { - DataIdType typeToBeAdded = new(_currentDataType, _identifierOfCurrentType); + DataIdType typeToBeAdded = new(currentDataType, identifierOfCurrentType); DataTypes.Add(typeToBeAdded); - _currentDataType = qualifier.DataType; - _identifierOfCurrentType.Clear(); - _identifierOfCurrentType.Add(qualifier.Identifier); + currentDataType = qualifier.DataType; + identifierOfCurrentType.Clear(); + identifierOfCurrentType.Add(qualifier.Identifier); } } } - public List Identify(bool MustMatchAllQualifer = true) + public List Identify(bool mustMatchAllQualifer = true) { List winners = new(); @@ -55,14 +54,14 @@ namespace Gremlin_BlazorServer.Services.GUClasses { foreach (string qualifier in datatype.Qualifiers) { - if (_mappingTable.ContainsKey(qualifier)) + if (mappingTable.ContainsKey(qualifier)) { datatype.AddFoundQualfier(qualifier); } } } - if (MustMatchAllQualifer) + if (mustMatchAllQualifer) { foreach (DataIdType dataType in DataTypes) //may return multiple winners { @@ -81,7 +80,7 @@ namespace Gremlin_BlazorServer.Services.GUClasses //1. Remove "PL", "AccountType", "Submarket" from Winner-List, if detected datatype is "LSAG" or "Account". //2. LSAG = Account + Contact --> when LSAG is a winner, remove "LSAG" and add "Account" and "Contact" to use their dedicated import methods. //3. Remove any other winner, when winner is one of "PL", "AccountType", "Submarket" AND fields[].count = 2. - if (MustMatchAllQualifer == true && winners.Contains("LSAG")) + if (mustMatchAllQualifer == true && winners.Contains("LSAG")) { if (winners.Contains("ProductLine")) { @@ -109,7 +108,7 @@ namespace Gremlin_BlazorServer.Services.GUClasses } } - if (MustMatchAllQualifer == true && winners.Contains("Account")) + if (mustMatchAllQualifer == true && winners.Contains("Account")) { if (winners.Contains("ProductLine")) { @@ -127,7 +126,7 @@ namespace Gremlin_BlazorServer.Services.GUClasses } } - if (MustMatchAllQualifer == false && _mappingTable.Count == 2) + if (mustMatchAllQualifer == false && mappingTable.Count == 2) { if (winners.Contains("ProductLine")) {