using Gremlin_BlazorServer.Data.DBClasses; using Gremlin_BlazorServer.Data.EntityClasses; using Microsoft.EntityFrameworkCore; using System.Diagnostics; using System.Text; using System.Globalization; namespace Gremlin_BlazorServer.Services { public class QuoteService { private static GremlinContext gremlinContext = new(); public QuoteService(GremlinContext gC) => gremlinContext = gC; 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> 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(); return true; } catch (Exception exception) { Debug.WriteLine(exception.Message); return false; } } public async Task GetQuoteAsync(uint quoteId) => await gremlinContext.Quotes.FirstOrDefaultAsync(q => q.QuoteId.Equals(quoteId)) ?? new Quote(); public async Task UpdateQuoteAsync(Quote Quote) { _ = gremlinContext.Quotes.Update(Quote); _ = await gremlinContext.SaveChangesAsync(); return true; } public async Task DeleteQuoteAsync(Quote Quote) { _ = gremlinContext.Remove(Quote); _ = await gremlinContext.SaveChangesAsync(); return true; } public async Task CreateTex(Quote quote) { StringBuilder texString = await texService.CreateTexAsync(quote); if (texString.Length > 0) Debug.WriteLine("Creating TexFile succesfully."); else Debug.WriteLine("Error during TexFile creation!"); return texString; } //FromWindowsGremlin public Quote ReadLineItems(Quote quote, string clipboard) { try { quote = ResetTotals(quote); quote.LineItems = ReadLineItemsFromClipboard(clipboard); quote.QuoteContains3PP = DoesContains(quote, "3PP"); quote.QuoteContainsRB = DoesContains(quote, "RB"); quote.TotalListprice = GetTotal(quote, "TotalListprice"); quote.TotalDiscount = GetTotal(quote, "AverageDiscount"); quote.TotalNet = GetTotal(quote, "TotalNet"); quote.ValidFor = CheckForAcademic(quote.Recipient); foreach (LineItem lineItem in quote.LineItems) { if (lineItem.OptionNumber != null) { // normale Gewährleistungsverlängerung if (lineItem.OptionNumber.StartsWith("8D")) { quote.Warranty = int.Parse(lineItem.OptionNumber.Last().ToString()) * 12; } //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; } } //AddToTotal //quote.TotalListprice += lineItem.ListPrice; //quote.TotalNet += lineItem.Total; } quote = CalculateTotals(quote); return quote; } catch { Debug.WriteLine("Reading of LineItems from Clipboard failed!"); return new Quote(); } } private static List ReadLineItemsFromClipboard(string clipboard) { //Zeilen aufteilen IEnumerable clipboardLines = clipboard.Split(Environment.NewLine.ToCharArray()); List clipboardList = new(); foreach (string clipboardLine in clipboardLines) { if (clipboardLine != "") { //Nach Trennzeichen trennen string[] clipboardLineSplit = clipboardLine.Split('\t'); clipboardList.Add(clipboardLineSplit); } } return ParseClipboardList(clipboardList); } 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) { //Anzahl an Spalten entspricht Clipboard if (lineItemString.Length == 19) { //Header ignorieren if (lineItemString[0] == "#") { countEmpty++; continue; } //Dateiinhalt in Klasse schreiben LineItem lineItem = new() { Position = ushort.Parse(lineItemString[0]), ProductNumber = lineItemString[1], OptionNumber = lineItemString[2], ProductLine = lineItemString[3], SapShortDescription = lineItemString[4], Amount = ushort.Parse(lineItemString[5]), ListPrice = decimal.Parse(lineItemString[6], cultureInfoUs), TotalDiscount = decimal.Parse(lineItemString[9], cultureInfoUs), NetPrice = decimal.Parse(lineItemString[10], cultureInfoUs), Total = decimal.Parse(lineItemString[11], cultureInfoUs), SalesDiscount = decimal.Parse(lineItemString[12], cultureInfoUs), ContractualDiscount = decimal.Parse(lineItemString[13], cultureInfoUs), PromotionalDiscount = decimal.Parse(lineItemString[14], cultureInfoUs), DemoDiscount = decimal.Parse(lineItemString[15], cultureInfoUs) }; lineItems.Add(lineItem); } else { Debug.WriteLine("Angebot konnte nicht eingelesen werden!"); countError++; continue; } } return lineItems; } 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); } private static decimal GetFreight(decimal net, decimal freight) { decimal freightNet = net * freight / 100; return freightNet < 3000 ? freightNet : 3000; } private static Quote CalculateTotals(Quote quote) { 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; return quote; } private static Quote ResetTotals(Quote quote) { quote.TotalListprice = 0; quote.TotalNet = 0; quote.TotalFreightOnly = 0; quote.TotalFreight = 0; quote.TotalVAT = 0; quote.TotalGross = 0; return quote; } private static decimal GetTotal(Quote quote, string type) { decimal total = 0; foreach (LineItem lineItem in quote.LineItems) { switch (type) { case "TotalListprice": total += lineItem.ListPrice; break; case "TotalNet": total += lineItem.Total; break; case "AverageDiscount": total += lineItem.TotalDiscount; break; } } if (type == "AverageDiscount" & quote.LineItems.Count != 0) { total /= quote.LineItems.Count; } return total; } private static bool DoesContains(Quote quote, string type) { foreach (LineItem lineItem in quote.LineItems) { switch (type) { case "3PP": if (lineItem.ProductLine == "3PP") { Debug.WriteLine($"Quote containts 3PP with ProductNumber {lineItem.ProductNumber}"); return true; } break; case "RB": if (lineItem.ProductLine == "RB" & lineItem.ProductNumber != "R2005A") { Debug.WriteLine($"Quote containts RB with ProductNumber {lineItem.ProductNumber}"); return true; } break; } } return false; } } }