diff --git a/Elwig/Documents/PaymentVariantSummary.cs b/Elwig/Documents/PaymentVariantSummary.cs index 0c39a11..8818958 100644 --- a/Elwig/Documents/PaymentVariantSummary.cs +++ b/Elwig/Documents/PaymentVariantSummary.cs @@ -1,6 +1,8 @@ -using Elwig.Helpers.Billing; +using Elwig.Helpers; +using Elwig.Helpers.Billing; using Elwig.Models.Dtos; using Elwig.Models.Entities; +using System.Collections.Generic; using System.Linq; namespace Elwig.Documents { @@ -15,6 +17,8 @@ namespace Elwig.Documents { public int MemberNum; public int DeliveryNum; public int DeliveryPartNum; + public List ModifierStat; + public Dictionary Modifiers; public PaymentVariantSummary(PaymentVar v, PaymentVariantSummaryData data) : base($"{Name} {v.Year} - {v.Name}") { @@ -25,6 +29,8 @@ namespace Elwig.Documents { MemberNum = v.Credits.Count; DeliveryNum = v.DeliveryPartPayments.DistinctBy(p => p.DeliveryPart.Delivery).Count(); DeliveryPartNum = v.DeliveryPartPayments.Count; + ModifierStat = AppDbContext.GetModifierStats(v.Year, v.AvNr).GetAwaiter().GetResult(); + Modifiers = v.Season.Modifiers.ToDictionary(m => m.ModId); } } } diff --git a/Elwig/Documents/PaymentVariantSummary.cshtml b/Elwig/Documents/PaymentVariantSummary.cshtml index 43c4b14..0e8833f 100644 --- a/Elwig/Documents/PaymentVariantSummary.cshtml +++ b/Elwig/Documents/PaymentVariantSummary.cshtml @@ -167,6 +167,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach (var m in Model.ModifierStat) { + var mod = Model.Modifiers[m.ModId]; + + + + + + + + + } + +
NameZu-/AbschlagLieferungenMinimumMaximumBetrag
[#][@Model.CurrencySymbol][@Model.CurrencySymbol][@Model.CurrencySymbol]
@mod.Name@mod.ValueStr@($"{m.Count:N0}")@($"{m.Min:N2}")@($"{m.Max:N2}")@($"{m.Sum:N2}")
diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index d7cac24..449e418 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -19,6 +19,7 @@ namespace Elwig.Helpers { public record struct UnderDelivery(int Weight, int Diff); public record struct MemberBucket(string Name, int Area, int Obligation, int Right, int Delivery, int DeliveryStrict, int Payment); public record struct MemberStat(string Variety, string Discr, int Weight); + public record struct ModifierStat(string ModId, string Name, int Count, decimal? Min, decimal? Max, decimal Sum); public class AppDbContext : DbContext { @@ -437,5 +438,34 @@ namespace Elwig.Helpers { if (ownCnx) await cnx.DisposeAsync(); return list; } + + public static async Task> GetModifierStats(int year, int avnr, SqliteConnection? cnx = null) { + var ownCnx = cnx == null; + cnx ??= await ConnectAsync(); + var list = new List(); + using (var cmd = cnx.CreateCommand()) { + cmd.CommandText = $""" + SELECT m.modid, m.name, m.count, m.min, m.max, m.sum, s.precision + FROM v_stat_modifier m + JOIN season s ON s.year = m.year + WHERE m.year = {year} AND m.avnr = {avnr} + """; + using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) { + var prec = (byte)reader.GetInt16(6); + long? min = reader.IsDBNull(3) ? null : reader.GetInt64(3); + long? max = reader.IsDBNull(4) ? null : reader.GetInt64(4); + var sum = reader.GetInt64(5); + if (min != null && max != null && Math.Abs((long)min) > Math.Abs((long)max)) + (min, max) = (max, min); + list.Add(new(reader.GetString(0), reader.GetString(1), reader.GetInt32(2), + min == null ? null : Utils.DecFromDb((long)min, prec), + max == null ? null : Utils.DecFromDb((long)max, prec), + Utils.DecFromDb(sum, prec))); + } + } + if (ownCnx) await cnx.DisposeAsync(); + return list; + } } } diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index dd7a737..6c3d86f 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -9,7 +9,7 @@ namespace Elwig.Helpers { public static class AppDbUpdater { // Don't forget to update value in Tests/fetch-resources.bat! - public static readonly int RequiredSchemaVersion = 22; + public static readonly int RequiredSchemaVersion = 23; private static int VersionOffset = 0; diff --git a/Elwig/Resources/Sql/22-23.sql b/Elwig/Resources/Sql/22-23.sql new file mode 100644 index 0000000..162c27c --- /dev/null +++ b/Elwig/Resources/Sql/22-23.sql @@ -0,0 +1,15 @@ +-- schema version 20 to 21 + +CREATE VIEW v_stat_modifier AS +SELECT v.year, v.avnr, m.modid, m.name, m.abs, m.rel, + COUNT(*) AS count, + MIN(IIF(p.net_amount = 0 AND m.abs IS NULL, NULL, ROUND(COALESCE(d.weight * m.abs, 0) + COALESCE(p.net_amount * m.rel, 0)))) AS min, + MAX(IIF(p.net_amount = 0 AND m.abs IS NULL, NULL, ROUND(COALESCE(d.weight * m.abs, 0) + COALESCE(p.net_amount * m.rel, 0)))) AS max, + SUM(ROUND(COALESCE(d.weight * m.abs, 0) + COALESCE(p.net_amount * m.rel, 0))) AS sum +FROM payment_variant v + JOIN modifier m ON m.year = v.year + JOIN delivery_part d ON d.year = v.year + JOIN delivery_part_modifier x ON (x.year, x.did, x.dpnr, x.modid) = (d.year, d.did, d.dpnr, m.modid) + LEFT JOIN payment_delivery_part p ON (p.year, p.did, p.dpnr, p.avnr) = (d.year, d.did, d.dpnr, v.avnr) +GROUP BY v.year, v.avnr, m.modid +ORDER BY v.year, v.avnr, m.ordering; diff --git a/Tests/fetch-resources.bat b/Tests/fetch-resources.bat index eb7707e..2f43848 100644 --- a/Tests/fetch-resources.bat +++ b/Tests/fetch-resources.bat @@ -1 +1 @@ -curl --fail -s -L "https://elwig.at/files/create.sql?v=22" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql" +curl --fail -s -L "https://elwig.at/files/create.sql?v=23" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql"