using Elwig.Models.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; namespace Elwig.Helpers.Billing { public class EditBillingData : BillingData { protected readonly IEnumerable AttributeVariants; public EditBillingData(JsonObject data, IEnumerable attributeVariants) : base(data) { AttributeVariants = attributeVariants; } public static EditBillingData FromJson(string json, IEnumerable attributeVariants) { return new(ParseJson(json), attributeVariants); } public IEnumerable GetPaymentGraphEntries(AppDbContext context, Season season) { Dictionary> dict1 = []; Dictionary> dict2 = []; var p = GetPaymentEntry(); if (p is JsonObject paymentObj) { foreach (var (selector, node) in paymentObj) { 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 (p is JsonValue paymentVal) { if (paymentVal.TryGetValue(out var price)) { if (!dict2.ContainsKey(price)) dict2[price] = []; dict2[price].Add("default"); } else if (paymentVal.TryGetValue(out var curve)) { var idx = int.Parse(curve.Split(":")[1] ?? "0"); if (!dict1.ContainsKey(idx)) dict1[idx] = []; dict1[idx].Add("default"); } } var virtOffset = dict1.Count > 0 ? dict1.Max(e => e.Key) + 1 : 1; Dictionary curves = GetCurves(); decimal[] virtCurves = [.. dict2.Keys.Order()]; for (int i = 0; i < virtCurves.Length; i++) { var idx = virtCurves[i]; dict1[i + virtOffset] = dict2[idx]; curves[i + virtOffset] = new Curve(CurveMode.Oe, new() { { 73, idx } }, null); } Dictionary> dict3 = curves.ToDictionary(c => c.Key, _ => new List()); foreach (var (selector, value) in GetSelection(p, AttributeVariants)) { int? idx = null; if (value.TryGetValue(out var val)) { idx = Array.IndexOf(virtCurves, val) + virtOffset; } else if (value.TryGetValue(out var str)) { idx = int.Parse(str.Split(":")[1]); } if (idx != null) 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 dict3 .Select(e => new GraphEntry(e.Key, season.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"); } } } // TODO List list = []; // set abgewertet = true return list; } } }