From ce3185842a5d9c06f0c962cf394ca5927e7a6a08 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Wed, 24 Jan 2024 23:37:19 +0100 Subject: [PATCH] BillingData: Implement GetQualtyGraphEntries --- Elwig/Helpers/Billing/BillingData.cs | 1 - Elwig/Helpers/Billing/EditBillingData.cs | 69 +++++++++--------------- Elwig/Windows/ChartWindow.xaml.cs | 7 ++- 3 files changed, 29 insertions(+), 48 deletions(-) diff --git a/Elwig/Helpers/Billing/BillingData.cs b/Elwig/Helpers/Billing/BillingData.cs index 38eb74f..87bc21a 100644 --- a/Elwig/Helpers/Billing/BillingData.cs +++ b/Elwig/Helpers/Billing/BillingData.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Reflection; using System.Text.Json.Nodes; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Helpers.Billing { public class BillingData { diff --git a/Elwig/Helpers/Billing/EditBillingData.cs b/Elwig/Helpers/Billing/EditBillingData.cs index 3bda587..eebe4d6 100644 --- a/Elwig/Helpers/Billing/EditBillingData.cs +++ b/Elwig/Helpers/Billing/EditBillingData.cs @@ -18,11 +18,10 @@ namespace Elwig.Helpers.Billing { return new(ParseJson(json), attributeVariants); } - public IEnumerable GetPaymentGraphEntries(AppDbContext context, Season season) { + private (Dictionary, Dictionary>) GetGraphEntries(JsonNode root) { Dictionary> dict1 = []; Dictionary> dict2 = []; - var p = GetPaymentEntry(); - if (p is JsonObject paymentObj) { + if (root is JsonObject paymentObj) { foreach (var (selector, node) in paymentObj) { var val = node?.AsValue(); if (val == null) { @@ -36,7 +35,7 @@ namespace Elwig.Helpers.Billing { dict1[idx].Add(selector); } } - } else if (p is JsonValue paymentVal) { + } else if (root is JsonValue paymentVal) { if (paymentVal.TryGetValue(out var price)) { if (!dict2.ContainsKey(price)) dict2[price] = []; dict2[price].Add("default"); @@ -57,7 +56,7 @@ namespace Elwig.Helpers.Billing { } Dictionary> dict3 = curves.ToDictionary(c => c.Key, _ => new List()); - foreach (var (selector, value) in GetSelection(p, AttributeVariants)) { + foreach (var (selector, value) in GetSelection(root, AttributeVariants)) { int? idx = null; if (value.TryGetValue(out var val)) { idx = Array.IndexOf(virtCurves, val) + virtOffset; @@ -68,51 +67,35 @@ namespace Elwig.Helpers.Billing { dict3[(int)idx].Add(selector); } - var vars = context.WineVarieties.ToDictionary(v => v.SortId, v => v); - var attrs = context.WineAttributes.ToDictionary(a => a.AttrId, a => a); + return (curves, dict3); + } - return dict3 - .Select(e => new GraphEntry(e.Key, season.Precision, curves[e.Key], e.Value + private static List CreateGraphEntries(AppDbContext ctx, int precision, Dictionary curves, Dictionary> entries) { + var vars = ctx.WineVarieties.ToDictionary(v => v.SortId, v => v); + var attrs = ctx.WineAttributes.ToDictionary(a => a.AttrId, a => a); + return entries + .Select(e => new GraphEntry(e.Key, precision, curves[e.Key], e.Value .Select(s => new ContractSelection(vars[s[..2]], s.Length > 2 ? attrs[s[2..]] : null)) .ToList())) .ToList(); } - public IEnumerable GetQualityGraphEntries(AppDbContext context, Season season) { - Dictionary> dict1 = []; - Dictionary> dict2 = []; - foreach (var (qualid, q) in GetQualityEntry() ?? []) { - if (q is JsonObject qualityObj) { - foreach (var (selector, node) in qualityObj) { - var val = node?.AsValue(); - if (val == null) { - continue; - } else if (val.TryGetValue(out var price)) { - if (!dict2.ContainsKey(price)) dict2[price] = []; - dict2[price].Add(selector); - } else if (val.TryGetValue(out var curve)) { - var idx = int.Parse(curve.Split(":")[1] ?? "0"); - if (!dict1.ContainsKey(idx)) dict1[idx] = []; - dict1[idx].Add(selector); - } - } - } else if (q is JsonValue qualityVal) { - if (qualityVal.TryGetValue(out var price)) { - if (!dict2.ContainsKey(price)) dict2[price] = []; - dict2[price].Add("default"); - } else if (qualityVal.TryGetValue(out var curve)) { - var idx = int.Parse(curve.Split(":")[1] ?? "0"); - if (!dict1.ContainsKey(idx)) dict1[idx] = []; - dict1[idx].Add("default"); - } - } + public IEnumerable GetPaymentGraphEntries(AppDbContext ctx, Season season) { + var root = GetPaymentEntry(); + var (curves, entries) = GetGraphEntries(root); + return CreateGraphEntries(ctx, season.Precision, curves, entries); + } + + public IEnumerable GetQualityGraphEntries(AppDbContext ctx, Season season, int idOffset = 0) { + var root = GetQualityEntry(); + if (root == null || root["WEI"] is not JsonNode qualityWei) + return []; + var (curves, entries) = GetGraphEntries(qualityWei); + var list = CreateGraphEntries(ctx, season.Precision, curves, entries).Where(e => e.Contracts.Count > 0); + foreach (var e in list) { + e.Id += idOffset; + e.Abgewertet = true; } - - // TODO - - List list = []; - // set abgewertet = true - return list; } } diff --git a/Elwig/Windows/ChartWindow.xaml.cs b/Elwig/Windows/ChartWindow.xaml.cs index ef8753b..798cb72 100644 --- a/Elwig/Windows/ChartWindow.xaml.cs +++ b/Elwig/Windows/ChartWindow.xaml.cs @@ -9,13 +9,11 @@ using Elwig.Controls; using Elwig.Helpers; using Elwig.Helpers.Billing; using Elwig.Models.Entities; -using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using ScottPlot.Plottables; using ScottPlot; using Xceed.Wpf.Toolkit.Primitives; using ScottPlot.Control; -using LinqKit; namespace Elwig.Windows { public partial class ChartWindow : ContextWindow { @@ -87,9 +85,10 @@ namespace Elwig.Windows { Season = await Context.Seasons.FindAsync(Year) ?? throw new ArgumentException("Season not found"); var data = EditBillingData.FromJson(PaymentVar.Data, Utils.GetAttributeVarieties(Context, Year)); + var paymentEntries = data.GetPaymentGraphEntries(Context, Season); GraphEntries = [ - ..data.GetPaymentGraphEntries(Context, Season), - ..data.GetQualityGraphEntries(Context, Season) + ..paymentEntries, + ..data.GetQualityGraphEntries(Context, Season, paymentEntries.Max(e => e.Id)) ]; var contracts = Utils.GetContractsForYear(Context, Year);