diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index 41627b1..d7cac24 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -355,27 +355,6 @@ namespace Elwig.Helpers { _memberUnderDelivery[year] = buckets; } - public async Task> GetBusinessSharePenalties(int year) { - using var cnx = await ConnectAsync(); - var dict = new Dictionary(); - using var cmd = cnx.CreateCommand(); - cmd.CommandText = $""" - SELECT mgnr, ROUND(( - COALESCE(-s.penalty_amount, 0) + - COALESCE(-s.penalty_per_bs_amount * CEIL(CAST(-u.diff AS REAL) / s.min_kg_per_bs), 0) + - COALESCE(u.diff * s.penalty_per_kg, 0) - ) / POW(10, s.precision - 2)) - FROM v_total_under_delivery u - JOIN season s ON s.year = u.year - WHERE s.year = {year} AND u.diff < 0 - """; - using var reader = await cmd.ExecuteReaderAsync(); - while (await reader.ReadAsync()) { - dict[reader.GetInt32(0)] = reader.GetInt64(1); - } - return dict; - } - public async Task> GetMemberAreaCommitmentBuckets(int year, int mgnr, SqliteConnection? cnx = null) { if (!_memberAreaCommitmentBuckets.ContainsKey(year)) await FetchMemberAreaCommitmentBuckets(year, cnx); diff --git a/Elwig/Models/Dtos/CreditNoteData.cs b/Elwig/Models/Dtos/CreditNoteData.cs index 601210f..7b8c6e1 100644 --- a/Elwig/Models/Dtos/CreditNoteData.cs +++ b/Elwig/Models/Dtos/CreditNoteData.cs @@ -30,6 +30,7 @@ namespace Elwig.Models.Dtos { ("Penalties", "Pönalen FB", "€", 20), ("Penalty", "Unterl. GA", "€", 20), ("AutoBs", "GA Nachz.", "€", 20), + ("Custom", "Weitere", "€", 20), ("Others", "Sonstige", "€", 20), ("Considered", "Berückstgt.", "€", 20), ("Amount", "Betrag", "€", 20), @@ -42,9 +43,8 @@ namespace Elwig.Models.Dtos { public static async Task ForPaymentVariant(AppDbContext ctx, int year, int avnr) { var variant = await ctx.PaymentVariants.FindAsync(year, avnr); var name = variant!.Name; - var bsPenalty = await ctx.GetBusinessSharePenalties(year); var data = BillingData.FromJson(variant!.Data); - var rows = (await FromDbSet(ctx.CreditNoteRows, year, avnr)).Select(r => new CreditNoteRow(r, data, bsPenalty)).ToList(); + var rows = (await FromDbSet(ctx.CreditNoteRows, year, avnr)).Select(r => new CreditNoteRow(r, data)).ToList(); return new CreditNoteData(rows, year, name); } @@ -56,16 +56,20 @@ namespace Elwig.Models.Dtos { p.plz, o.name AS ort, m.address, m.iban, c.tgnr, s.year, s.precision, p.amount - p.net_amount AS surcharge, c.net_amount, c.prev_net_amount, c.vat, c.vat_amount, c.gross_amount, c.modifiers, c.prev_modifiers, c.amount, - ROUND(COALESCE(u.total_penalty, 0) / POW(10, 4 - 2)) AS fb_penalty, - ROUND(COALESCE(a.total_amount, 0) / POW(10, s.precision - 2)) AS auto_bs + ROUND(b.total_penalty / POW(10, s.precision - 2)) AS bs_penalty, + ROUND(u.total_penalty / POW(10, 4 - 2)) AS fb_penalty, + ROUND(-a.total_amount / POW(10, s.precision - 2)) AS auto_bs, + x.amount AS custom_mod FROM credit c LEFT JOIN member m ON m.mgnr = c.mgnr LEFT JOIN payment_member p ON (p.year, p.avnr, p.mgnr) = (c.year, c.avnr, c.mgnr) LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest LEFT JOIN AT_ort o ON o.okz = p.okz LEFT JOIN season s ON s.year = c.year + LEFT JOIN v_penalty_business_shares b ON (b.year, b.mgnr) = (s.year, m.mgnr) LEFT JOIN v_penalty_area_commitments u ON (u.year, u.mgnr) = (s.year, m.mgnr) LEFT JOIN v_auto_business_shares a ON (a.year, a.mgnr) = (s.year, m.mgnr) + LEFT JOIN payment_custom x ON (x.year, x.mgnr) = (s.year, m.mgnr) WHERE c.year = {year} AND c.avnr = {avnr} ORDER BY m.mgnr """).ToListAsync(); @@ -91,11 +95,12 @@ namespace Elwig.Models.Dtos { public decimal? Penalties; public decimal? Penalty; public decimal? AutoBs; + public decimal? Custom; public decimal? Others; public decimal? Considered; public decimal Amount; - public CreditNoteRow(CreditNoteRowSingle row, BillingData data, Dictionary bsPenalty) { + public CreditNoteRow(CreditNoteRowSingle row, BillingData data) { byte prec1 = 2, prec2 = row.Precision; MgNr = row.MgNr; Name1 = row.Name1; @@ -117,12 +122,14 @@ namespace Elwig.Models.Dtos { } decimal mod = (row.Modifiers == null) ? 0 : Utils.DecFromDb((long)row.Modifiers, prec1); if (data.ConsiderContractPenalties) - Penalties = (row.FbPenalty == null || row.FbPenalty == 0) ? null : Utils.DecFromDb((long)row.FbPenalty, prec1); + Penalties = (row.FbPenalty == null) ? null : Utils.DecFromDb((long)row.FbPenalty, prec1); if (data.ConsiderTotalPenalty) - Penalty = (!bsPenalty.TryGetValue(row.MgNr, out var val) || val == 0) ? null : Utils.DecFromDb(val, prec1); + Penalty = (row.BsPenalty == null) ? null : Utils.DecFromDb((long)row.BsPenalty, prec1); if (data.ConsiderAutoBusinessShares) - AutoBs = (row.AutoBs == null || row.AutoBs == 0) ? null : -Utils.DecFromDb((long)row.AutoBs, prec1); - mod -= (Penalties ?? 0) + (Penalty ?? 0) + (AutoBs ?? 0); + AutoBs = (row.AutoBs == null) ? null : Utils.DecFromDb((long)row.AutoBs, prec1); + if (data.ConsiderCustomModifiers) + Custom = (row.CustomMod == null) ? null : Utils.DecFromDb((long)row.CustomMod, prec1); + mod -= (Penalties ?? 0) + (Penalty ?? 0) + (AutoBs ?? 0) + (Custom ?? 0); Others = (mod == 0) ? null : mod; Gross = Utils.DecFromDb(row.GrossAmount, prec1); Considered = (row.PrevModifiers == null || row.PrevModifiers == 0) ? null : -Utils.DecFromDb((long)row.PrevModifiers, prec1); @@ -172,9 +179,13 @@ namespace Elwig.Models.Dtos { public long? PrevModifiers { get; set; } [Column("amount")] public long Amount { get; set; } + [Column("bs_penalty")] + public long? BsPenalty { get; set; } [Column("fb_penalty")] public long? FbPenalty { get; set; } [Column("auto_bs")] public long? AutoBs { get; set; } + [Column("custom_mod")] + public long? CustomMod { get; set; } } } diff --git a/Elwig/Windows/PaymentAdjustmentWindow.xaml b/Elwig/Windows/PaymentAdjustmentWindow.xaml index d4641a4..f3a4333 100644 --- a/Elwig/Windows/PaymentAdjustmentWindow.xaml +++ b/Elwig/Windows/PaymentAdjustmentWindow.xaml @@ -118,7 +118,7 @@ - +