From eebddf0527ee3a71a8574d8b3d178f175d1a9f9d Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 2 Nov 2023 13:06:32 +0100 Subject: [PATCH] Billing: Rename bins to buckets --- Elwig/Documents/CreditNote.cs | 4 +- Elwig/Documents/CreditNote.cshtml | 32 +++++----- Elwig/Documents/DeliveryConfirmation.cs | 4 +- Elwig/Documents/DeliveryConfirmation.cshtml | 26 ++++---- Elwig/Documents/DeliveryNote.cs | 4 +- Elwig/Documents/DeliveryNote.cshtml | 6 +- Elwig/Helpers/AppDbContext.cs | 70 ++++++++++----------- Elwig/Helpers/Billing/Billing.cs | 10 +-- Elwig/Models/DeliveryPart.cs | 2 +- Elwig/Windows/SeasonFinishWindow.xaml | 6 +- Elwig/Windows/SeasonFinishWindow.xaml.cs | 12 ++-- 11 files changed, 88 insertions(+), 88 deletions(-) diff --git a/Elwig/Documents/CreditNote.cs b/Elwig/Documents/CreditNote.cs index bf6a16f..d674737 100644 --- a/Elwig/Documents/CreditNote.cs +++ b/Elwig/Documents/CreditNote.cs @@ -10,7 +10,7 @@ namespace Elwig.Documents { public Credit Credit; public string? Text; public string CurrencySymbol; - public string[] BinNames; + public string[] BucketNames; public int Precision; public IEnumerable Parts; @@ -27,7 +27,7 @@ namespace Elwig.Documents { Text = App.Client.TextDeliveryNote; DocumentId = $"Tr.-Gutschr. {c.TgId}"; CurrencySymbol = c.Payment.Variant.Season.Currency.Symbol ?? c.Payment.Variant.Season.Currency.Code; - BinNames = new string[0]; // FIXME + BucketNames = new string[0]; // FIXME Precision = c.Payment.Variant.Season.Precision; Parts = ctx.DeliveryParts.FromSql($""" SELECT p.* diff --git a/Elwig/Documents/CreditNote.cshtml b/Elwig/Documents/CreditNote.cshtml index a841b3d..c1593e3 100644 --- a/Elwig/Documents/CreditNote.cshtml +++ b/Elwig/Documents/CreditNote.cshtml @@ -4,7 +4,7 @@ @{ Layout = "BusinessDocument"; } @{ - var binNum = Model.BinNames.Length; + var bucketNum = Model.BucketNames.Length; }

@Model.Title

@@ -30,7 +30,7 @@ Attribut Gradation Zu-/Abschläge - @Raw(string.Join("
", Model.BinNames)) + @Raw(string.Join("
", Model.BucketNames)) Betrag @@ -61,23 +61,23 @@ var pmt = part.Payment; var abs = pmt?.ModAbs == null || pmt?.ModAbs == 0 ? "-" : pmt?.ModAbs.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision))); var rel = pmt?.ModRel == null || pmt?.ModRel == 0 ? "-" : $"{pmt?.ModRel * 100:0.00##}"; - - @part.Delivery.LsNr - @part.DPNr - @part.Variant.Name - @part.Attribute?.Name - @($"{part.Oe:N0}") - @($"{part.Kmw:N1}") - @abs - @rel + + @part.Delivery.LsNr + @part.DPNr + @part.Variant.Name + @part.Attribute?.Name + @($"{part.Oe:N0}") + @($"{part.Kmw:N1}") + @abs + @rel - @Raw(FormatRow(pmt?.DeliveryPart.Bins?.ElementAtOrDefault(0)?.Value, 0)) - @($"{pmt?.Amount:N2}") + @Raw(FormatRow(pmt?.DeliveryPart.Buckets?.ElementAtOrDefault(0)?.Value, 0)) + @($"{pmt?.Amount:N2}") - @for (int i = 1; i < binNum; i++) { - + @for (int i = 1; i < bucketNum; i++) { + - @Raw(FormatRow(pmt?.DeliveryPart.Bins?.ElementAtOrDefault(i)?.Value, 0)) + @Raw(FormatRow(pmt?.DeliveryPart.Buckets?.ElementAtOrDefault(i)?.Value, 0)) } last = part.SortId; diff --git a/Elwig/Documents/DeliveryConfirmation.cs b/Elwig/Documents/DeliveryConfirmation.cs index 5d01dcd..c29dc23 100644 --- a/Elwig/Documents/DeliveryConfirmation.cs +++ b/Elwig/Documents/DeliveryConfirmation.cs @@ -11,7 +11,7 @@ namespace Elwig.Documents { public Season Season; public IEnumerable Deliveries; public string? Text = App.Client.TextDeliveryConfirmation; - public Dictionary MemberBins; + public Dictionary MemberBuckets; public DeliveryConfirmation(AppDbContext ctx, int year, Member m, IEnumerable? deliveries = null) : base($"Anlieferungsbestätigung {year}", m) { @@ -28,7 +28,7 @@ namespace Elwig.Documents { ORDER BY v.sortid, v.abgewertet ASC, v.attribute_prio DESC, COALESCE(v.attrid, '~'), v.kmw DESC, v.lsnr, v.dpnr """) .ToList(); - MemberBins = ctx.GetMemberBins(Season.Year, m.MgNr).GetAwaiter().GetResult(); + MemberBuckets = ctx.GetMemberBuckets(Season.Year, m.MgNr).GetAwaiter().GetResult(); } } } diff --git a/Elwig/Documents/DeliveryConfirmation.cshtml b/Elwig/Documents/DeliveryConfirmation.cshtml index 25ddd5f..405bc50 100644 --- a/Elwig/Documents/DeliveryConfirmation.cshtml +++ b/Elwig/Documents/DeliveryConfirmation.cshtml @@ -44,11 +44,11 @@ var lastSortId = ""; } @foreach (var p in Model.Deliveries) { - var bins = p.Bins.Where(b => b.Value > 0).OrderByDescending(b => b.BktNr).ToArray(); - var rowsBins = bins.Length; + var buckets = p.Buckets.Where(b => b.Value > 0).OrderByDescending(b => b.BktNr).ToArray(); + var rowsBuckets = buckets.Length; var mods = p.Modifiers.Select(m => m.Name).ToArray(); var rowsMod = mods.Length + 1; - var rows = Math.Max(rowsBins, rowsMod); + var rows = Math.Max(rowsBuckets, rowsMod); var first = true; @for (int i = 0; i < rows; i++) { i + 1 ? "trailing" : "")"> @@ -66,14 +66,14 @@ } else if (i > 0) { } - @if (i < bins.Length) { - var bin = bins[i]; - @(bin.Discr == "_" ? "ungeb." : $"geb. {p.SortId}{bin.Discr}"): - @($"{bin.Value:N0}") + @if (i < buckets.Length) { + var bucket = buckets[i]; + @(bucket.Discr == "_" ? "ungeb." : $"geb. {p.SortId}{bucket.Discr}"): + @($"{bucket.Value:N0}") } else { } - @if (i == bins.Length - 1) { + @if (i == buckets.Length - 1) { @($"{p.Weight:N0}") } else { @@ -129,11 +129,11 @@ $"{(mode != 2 ? "" : obligation == 0 && right == 0 ? "-" : $"{payment:N0}")}" + $"{sum:N0}"; } - var mBins = Model.MemberBins.Where(b => b.Value.Item2 > 0 || b.Value.Item3 > 0 || b.Value.Item4 > 0).ToList(); - var fbVars = mBins.Where(b => b.Value.Item2 > 0 || b.Value.Item3 > 0).Select(b => b.Key.Replace("_", "")).Order().ToArray(); - var fbs = mBins.Where(b => fbVars.Contains(b.Key) && b.Key.Length == 2).OrderBy(b => b.Value.Item1); - var vtr = mBins.Where(b => fbVars.Contains(b.Key) && b.Key.Length > 2).OrderBy(b => b.Value.Item1); - var rem = mBins.Where(b => !fbVars.Contains(b.Key)).OrderBy(b => b.Value.Item1); + var mBuckets = Model.MemberBuckets.Where(b => b.Value.Item2 > 0 || b.Value.Item3 > 0 || b.Value.Item4 > 0).ToList(); + var fbVars = mBuckets.Where(b => b.Value.Item2 > 0 || b.Value.Item3 > 0).Select(b => b.Key.Replace("_", "")).Order().ToArray(); + var fbs = mBuckets.Where(b => fbVars.Contains(b.Key) && b.Key.Length == 2).OrderBy(b => b.Value.Item1); + var vtr = mBuckets.Where(b => fbVars.Contains(b.Key) && b.Key.Length > 2).OrderBy(b => b.Value.Item1); + var rem = mBuckets.Where(b => !fbVars.Contains(b.Key)).OrderBy(b => b.Value.Item1); } Gesamtlieferung lt. gez. GA diff --git a/Elwig/Documents/DeliveryNote.cs b/Elwig/Documents/DeliveryNote.cs index 43c67d0..3965c07 100644 --- a/Elwig/Documents/DeliveryNote.cs +++ b/Elwig/Documents/DeliveryNote.cs @@ -7,7 +7,7 @@ namespace Elwig.Documents { public Delivery Delivery; public string? Text; - public Dictionary MemberBins; + public Dictionary MemberBuckets; // 0 - none // 1 - GA only @@ -27,7 +27,7 @@ namespace Elwig.Documents { $""; Text = App.Client.TextDeliveryNote; DocumentId = d.LsNr; - MemberBins = ctx.GetMemberBins(d.Year, d.Member.MgNr).GetAwaiter().GetResult(); + MemberBuckets = ctx.GetMemberBuckets(d.Year, d.Member.MgNr).GetAwaiter().GetResult(); } } } diff --git a/Elwig/Documents/DeliveryNote.cshtml b/Elwig/Documents/DeliveryNote.cshtml index 354613a..beba3fb 100644 --- a/Elwig/Documents/DeliveryNote.cshtml +++ b/Elwig/Documents/DeliveryNote.cshtml @@ -108,7 +108,7 @@ $"{sum:N0}"; } var sortids = Model.Delivery.Parts.Select(p => p.SortId).ToList(); - var bins = Model.MemberBins.GroupBy(b => b.Key[..2]).ToDictionary(g => g.Key, g => g.Count()); + var buckets = Model.MemberBuckets.GroupBy(b => b.Key[..2]).ToDictionary(g => g.Key, g => g.Count()); } Gesamtlieferung lt. gez. GA @@ -122,8 +122,8 @@ Flächenbindungen: - @foreach (var (id, (name, right, obligation, sum, _)) in Model.MemberBins.OrderBy(b => b.Key)) { - if (right > 0 || obligation > 0 || (sum > 0 && bins[id[..2]] > 1 && !id.EndsWith('_'))) { + @foreach (var (id, (name, right, obligation, sum, _)) in Model.MemberBuckets.OrderBy(b => b.Key)) { + if (right > 0 || obligation > 0 || (sum > 0 && buckets[id[..2]] > 1 && !id.EndsWith('_'))) { @name @Raw(FormatRow(obligation, right, sum)) diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index f0e256b..1945aa0 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -53,8 +53,8 @@ namespace Elwig.Helpers { public static string ConnectionString => $"Data Source=\"{App.Config.DatabaseFile}\"; Foreign Keys=True; Mode=ReadWrite; Cache=Default"; private readonly Dictionary>> _memberRightsAndObligations = new(); - private readonly Dictionary>> _memberDeliveryBins = new(); - private readonly Dictionary>> _memberPaymentBins = new(); + private readonly Dictionary>> _memberDeliveryBuckets = new(); + private readonly Dictionary>> _memberPaymentBuckets = new(); public AppDbContext() { if (App.Config.DatabaseLog != null) { @@ -190,55 +190,55 @@ namespace Elwig.Helpers { private async Task FetchMemberRightsAndObligations(int year, SqliteConnection? cnx = null) { var ownCnx = cnx == null; cnx ??= await ConnectAsync(); - var bins = new Dictionary>(); + var buckets = new Dictionary>(); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $"SELECT mgnr, bucket, min_kg, max_kg FROM v_area_commitment_bucket WHERE year = {year}"; using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { var mgnr = reader.GetInt32(0); var vtrgid = reader.GetString(1); - if (!bins.ContainsKey(mgnr)) bins[mgnr] = new(); - bins[mgnr][vtrgid] = (reader.GetInt32(3), reader.GetInt32(2)); + if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new(); + buckets[mgnr][vtrgid] = (reader.GetInt32(3), reader.GetInt32(2)); } } if (ownCnx) await cnx.DisposeAsync(); - _memberRightsAndObligations[year] = bins; + _memberRightsAndObligations[year] = buckets; } - private async Task FetchMemberDeliveryBins(int year, SqliteConnection? cnx = null) { + private async Task FetchMemberDeliveryBuckets(int year, SqliteConnection? cnx = null) { var ownCnx = cnx == null; cnx ??= await ConnectAsync(); - var bins = new Dictionary>(); + var buckets = new Dictionary>(); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $"SELECT mgnr, bucket, weight FROM v_delivery_bucket WHERE year = {year}"; using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { var mgnr = reader.GetInt32(0); - var bin = reader.GetString(1); - if (!bins.ContainsKey(mgnr)) bins[mgnr] = new(); - bins[mgnr][bin] = reader.GetInt32(2); + var bucket = reader.GetString(1); + if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new(); + buckets[mgnr][bucket] = reader.GetInt32(2); } } if (ownCnx) await cnx.DisposeAsync(); - _memberDeliveryBins[year] = bins; + _memberDeliveryBuckets[year] = buckets; } - private async Task FetchMemberPaymentBins(int year, SqliteConnection? cnx = null) { + private async Task FetchMemberPaymentBuckets(int year, SqliteConnection? cnx = null) { var ownCnx = cnx == null; cnx ??= await ConnectAsync(); - var bins = new Dictionary>(); + var buckets = new Dictionary>(); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $"SELECT mgnr, bucket, weight FROM v_payment_bucket WHERE year = {year}"; using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { var mgnr = reader.GetInt32(0); - var bin = reader.GetString(1); - if (!bins.ContainsKey(mgnr)) bins[mgnr] = new(); - bins[mgnr][bin] = reader.GetInt32(2); + var bucket = reader.GetString(1); + if (!buckets.ContainsKey(mgnr)) buckets[mgnr] = new(); + buckets[mgnr][bucket] = reader.GetInt32(2); } } if (ownCnx) await cnx.DisposeAsync(); - _memberPaymentBins[year] = bins; + _memberPaymentBuckets[year] = buckets; } public async Task> GetMemberRightsAndObligations(int year, int mgnr, SqliteConnection? cnx = null) { @@ -247,41 +247,41 @@ namespace Elwig.Helpers { return _memberRightsAndObligations[year].GetValueOrDefault(mgnr, new()); } - public async Task> GetMemberDeliveryBins(int year, int mgnr, SqliteConnection? cnx = null) { - if (!_memberDeliveryBins.ContainsKey(year)) - await FetchMemberDeliveryBins(year, cnx); - return _memberDeliveryBins[year].GetValueOrDefault(mgnr, new()); + public async Task> GetMemberDeliveryBuckets(int year, int mgnr, SqliteConnection? cnx = null) { + if (!_memberDeliveryBuckets.ContainsKey(year)) + await FetchMemberDeliveryBuckets(year, cnx); + return _memberDeliveryBuckets[year].GetValueOrDefault(mgnr, new()); } - public async Task> GetMemberPaymentBins(int year, int mgnr, SqliteConnection? cnx = null) { - if (!_memberPaymentBins.ContainsKey(year)) - await FetchMemberPaymentBins(year, cnx); - return _memberPaymentBins[year].GetValueOrDefault(mgnr, new()); + public async Task> GetMemberPaymentBuckets(int year, int mgnr, SqliteConnection? cnx = null) { + if (!_memberPaymentBuckets.ContainsKey(year)) + await FetchMemberPaymentBuckets(year, cnx); + return _memberPaymentBuckets[year].GetValueOrDefault(mgnr, new()); } - public async Task> GetMemberBins(int year, int mgnr, SqliteConnection? cnx = null) { + public async Task> GetMemberBuckets(int year, int mgnr, SqliteConnection? cnx = null) { var ownCnx = cnx == null; cnx ??= await ConnectAsync(); var rightsAndObligations = await GetMemberRightsAndObligations(year, mgnr, cnx); - var deliveryBins = await GetMemberDeliveryBins(year, mgnr, cnx); - var paymentBins = await GetMemberPaymentBins(year, mgnr, cnx); + var deliveryBuckets = await GetMemberDeliveryBuckets(year, mgnr, cnx); + var paymentBuckets = await GetMemberPaymentBuckets(year, mgnr, cnx); if (ownCnx) await cnx.DisposeAsync(); - var bins = new Dictionary(); - foreach (var id in rightsAndObligations.Keys.Union(deliveryBins.Keys).Union(paymentBins.Keys)) { + var buckets = new Dictionary(); + foreach (var id in rightsAndObligations.Keys.Union(deliveryBuckets.Keys).Union(paymentBuckets.Keys)) { var variety = await WineVarieties.FindAsync(id[..2]); var attrIds = id[2..]; var attrs = await WineAttributes.Where(a => attrIds.Contains(a.AttrId)).ToListAsync(); var name = (variety?.Name ?? "") + (attrIds == "_" ? " (kein Qual.Wein)" : attrs.Count > 0 ? $" ({string.Join(" / ", attrs.Select(a => a.Name))})" : ""); - bins[id] = ( + buckets[id] = ( name, rightsAndObligations.GetValueOrDefault(id).Item1, rightsAndObligations.GetValueOrDefault(id).Item2, - deliveryBins.GetValueOrDefault(id), - paymentBins.GetValueOrDefault(id) + deliveryBuckets.GetValueOrDefault(id), + paymentBuckets.GetValueOrDefault(id) ); } - return bins; + return buckets; } } } diff --git a/Elwig/Helpers/Billing/Billing.cs b/Elwig/Helpers/Billing/Billing.cs index 91826e0..06c5841 100644 --- a/Elwig/Helpers/Billing/Billing.cs +++ b/Elwig/Helpers/Billing/Billing.cs @@ -38,7 +38,7 @@ namespace Elwig.Helpers.Billing { } } - public async Task CalculateBins(bool allowAttrsIntoLowerBins, bool avoidUnderDeliveries, bool honorGebunden) { + public async Task CalculateBuckets(bool allowAttrsIntoLower, bool avoidUnderDeliveries, bool honorGebunden) { var attrVals = Context.WineAttributes.ToDictionary(a => a.AttrId, a => (a.IsStrict, a.FillLower)); var attrForced = attrVals.Where(a => a.Value.IsStrict && a.Value.FillLower == 0).Select(a => a.Key).ToArray(); using var cnx = await AppDbContext.ConnectAsync(); @@ -103,7 +103,7 @@ namespace Elwig.Helpers.Billing { inserts.Add((did, dpnr, i, key[2..], v)); w -= v; } - if (w == 0 || (!allowAttrsIntoLowerBins && isStrict)) break; + if (w == 0 || (!allowAttrsIntoLower && isStrict)) break; } inserts.Add((did, dpnr, 0, "_", w)); lastMgNr = mgnr; @@ -138,7 +138,7 @@ namespace Elwig.Helpers.Billing { } } - var fittingBins = new Dictionary<(int, string), int>(); + var fittingBuckets = new Dictionary<(int, string), int>(); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $""" SELECT c.mgnr, c.bucket, COALESCE(p.weight, 0) - c.min_kg AS diff @@ -148,11 +148,11 @@ namespace Elwig.Helpers.Billing { """; using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { - fittingBins[(reader.GetInt32(0), reader.GetString(1))] = reader.GetInt32(2); + fittingBuckets[(reader.GetInt32(0), reader.GetString(1))] = reader.GetInt32(2); } } - foreach (var item in fittingBins) { + foreach (var item in fittingBuckets) { var mgnr = item.Key.Item1; var id = item.Key.Item2[..2]; var attr = item.Key.Item2[2..]; diff --git a/Elwig/Models/DeliveryPart.cs b/Elwig/Models/DeliveryPart.cs index dd8b4e9..702e7ce 100644 --- a/Elwig/Models/DeliveryPart.cs +++ b/Elwig/Models/DeliveryPart.cs @@ -115,6 +115,6 @@ namespace Elwig.Models { public string OriginString => Origin.OriginString + "\n" + (Kg?.Gl != null ? $" / {Kg.Gl.Name}" : "") + (Kg != null ? $" / {Kg.AtKg.Gem.Name} / KG {Kg.AtKg.Name}" : "") + (Rd != null ? $" / Ried {Rd.Name}" : ""); [InverseProperty("Part")] - public virtual ISet Bins { get; private set; } + public virtual ISet Buckets { get; private set; } } } diff --git a/Elwig/Windows/SeasonFinishWindow.xaml b/Elwig/Windows/SeasonFinishWindow.xaml index 2c59cd2..a610552 100644 --- a/Elwig/Windows/SeasonFinishWindow.xaml +++ b/Elwig/Windows/SeasonFinishWindow.xaml @@ -24,10 +24,10 @@ Margin="110,40,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" ValueChanged="SeasonInput_ValueChanged"/> -