diff --git a/Elwig/Documents/CreditNote.cs b/Elwig/Documents/CreditNote.cs index 71a5a1f..346f277 100644 --- a/Elwig/Documents/CreditNote.cs +++ b/Elwig/Documents/CreditNote.cs @@ -1,6 +1,7 @@ using Elwig.Helpers; using Elwig.Models.Dtos; using Elwig.Models.Entities; +using System.Linq; namespace Elwig.Documents { public class CreditNote : BusinessDocument { @@ -11,6 +12,7 @@ namespace Elwig.Documents { public string? Text; public string CurrencySymbol; public int Precision; + public string MemberModifier; public CreditNote(AppDbContext ctx, PaymentMember p, CreditNoteData data) : base($"Traubengutschrift {(p.Credit != null ? $"Nr. {p.Credit.Year}/{p.Credit.TgNr}" : p.Member.Name)} – {p.Variant.Name}", p.Member) { @@ -19,6 +21,13 @@ namespace Elwig.Documents { Data = data; Payment = p; Credit = p.Credit; + var season = p.Variant.Season; + var mod = App.Client.IsMatzen ? ctx.Modifiers.Where(m => m.Year == season.Year && m.Name.StartsWith("Treue")).FirstOrDefault() : null; + if (mod != null) { + MemberModifier = $"{mod.Name} ({mod.ValueStr})"; + } else { + MemberModifier = "Sonstige Zu-/Abschläge"; + } Aside = Aside.Replace("", "") + $"Gutschrift" + $"TG-Nr.{(p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr}" : "-")}" + @@ -27,7 +36,7 @@ namespace Elwig.Documents { $""; Text = App.Client.TextDeliveryNote; DocumentId = $"Tr.-Gutschr. " + (p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr}" : p.MgNr); - CurrencySymbol = p.Variant.Season.Currency.Symbol ?? p.Variant.Season.Currency.Code; - Precision = p.Variant.Season.Precision; + CurrencySymbol = season.Currency.Symbol ?? season.Currency.Code; + Precision = season.Precision; } }} diff --git a/Elwig/Documents/CreditNote.cshtml b/Elwig/Documents/CreditNote.cshtml index 3d7fec9..d2649cb 100644 --- a/Elwig/Documents/CreditNote.cshtml +++ b/Elwig/Documents/CreditNote.cshtml @@ -80,17 +80,69 @@ } } @if (Model.Payment == null) { - - - Gesamt: - @($"{Model.Data.Rows.Sum(p => p.Amount):N2}") - + + + Gesamt: + + + @Model.CurrencySymbol + @($"{Model.Data.Rows.Sum(p => p.Amount):N2}") + + } else { - - - Gesamt: - @($"{Model.Payment.NetAmount:N2}") - + var totalLine = false; + if (Model.Payment.NetAmount != Model.Payment.Amount) { + + + Zwischensumme: + + + @Model.CurrencySymbol + @($"{Model.Payment.NetAmount:N2}") + + + totalLine = true; + + + @Model.MemberModifier: + @(Model.Payment.NetAmount > Model.Payment.Amount ? "–" : "+") + + @Model.CurrencySymbol + @($"{Math.Abs(Model.Payment.Amount - Model.Payment.NetAmount):N2}") + + + } + if (Model.Credit == null) { + + + Gesamtbetrag: + + + @Model.CurrencySymbol + @($"{Model.Payment.Amount:N2}") + + + totalLine = true; + } else { + + + Nettobetrag: + + + + + + totalLine = true; + + + + Bruttobetrag: + + + + + + } } diff --git a/Elwig/Documents/CreditNote.css b/Elwig/Documents/CreditNote.css index adc096b..8fdfdaf 100644 --- a/Elwig/Documents/CreditNote.css +++ b/Elwig/Documents/CreditNote.css @@ -17,10 +17,11 @@ table.credit tr.last td { padding-bottom: 0; } -table.credit tr.sum { +table.credit .sum { font-size: 12pt; } -table.credit tr.sum td { - padding-top: 1mm; +table.credit tr.sum td, +table.credit td.sum { + padding-top: 1mm !important; } diff --git a/Elwig/Documents/Document.Table.css b/Elwig/Documents/Document.Table.css index a4f39fa..f49357b 100644 --- a/Elwig/Documents/Document.Table.css +++ b/Elwig/Documents/Document.Table.css @@ -122,11 +122,14 @@ main table tr.bold td { } main table tr.sum, +main table td.sum, main table tr.new, main table tr.border { border-top: 0.5pt solid black; } -main table tr.sum { + +main table tr.sum, +main table td.sum { break-before: avoid; } diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 42407b8..9c7b65a 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -4,14 +4,14 @@ using System; namespace Elwig.Helpers { public static class AppDbUpdater { - public static readonly int RequiredSchemaVersion = 11; + public static readonly int RequiredSchemaVersion = 12; private static int _versionOffset = 0; - private static readonly Action[] _updaters = new[] { + private static readonly Action[] _updaters = [ UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5, UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8, UpdateDbSchema_8_To_9, - UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11 - }; + UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11, UpdateDbSchema_11_To_12, + ]; private static void ExecuteNonQuery(SqliteConnection cnx, string sql) { using var cmd = cnx.CreateCommand(); @@ -800,5 +800,19 @@ namespace Elwig.Helpers { ExecuteNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount"); ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); } + + private static void UpdateDbSchema_11_To_12(SqliteConnection cnx) { + ExecuteNonQuery(cnx, """ + CREATE VIEW v_stat_member AS + SELECT year, mgnr, + SUM(weight) AS sum, + ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, + ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, + COUNT(DISTINCT did) AS lieferungen + FROM v_delivery + GROUP BY year, mgnr + ORDER BY year, mgnr; + """); + } } } diff --git a/Elwig/Helpers/Billing/BillingVariant.cs b/Elwig/Helpers/Billing/BillingVariant.cs index cf0beac..6caa57d 100644 --- a/Elwig/Helpers/Billing/BillingVariant.cs +++ b/Elwig/Helpers/Billing/BillingVariant.cs @@ -15,6 +15,7 @@ namespace Elwig.Helpers.Billing { await DeleteInDb(); await CalculatePrices(); await CalculateModifiers(); + await CalculateMemberModifiers(); } protected async Task DeleteInDb() { @@ -33,6 +34,36 @@ namespace Elwig.Helpers.Billing { } } + protected async Task CalculateMemberModifiers() { + using var cnx = await AppDbContext.ConnectAsync(); + if (App.Client.IsMatzen) { + var lastYears = 3; + var multiplier = 0.50; + var modName = "Treue%"; + using var cmd = cnx.CreateCommand(); + cmd.CommandText = $""" + INSERT INTO payment_member (year, avnr, mgnr, net_amount, mod_abs, mod_rel) + SELECT c.year, {AvNr}, s.mgnr, 0, + ROUND(s.sum * COALESCE(m.abs, 0)), + COALESCE(m.rel, 0) + FROM (SELECT {Year} AS year, mgnr, + ROUND(AVG(sum) * {multiplier}) AS baseline, + COUNT(*) = {lastYears} AND MIN(sum) > 0 AS allowed + FROM v_stat_member + WHERE year > {Year} - {lastYears} + GROUP BY mgnr + HAVING allowed) c + JOIN v_stat_member s ON (s.year, s.mgnr) = (c.year, c.mgnr) + LEFT JOIN modifier m ON m.year = c.year AND m.name LIKE '{modName}' + WHERE sum >= baseline + ON CONFLICT DO UPDATE + SET mod_abs = mod_abs + excluded.mod_abs, + mod_rel = mod_rel + excluded.mod_rel + """; + await cmd.ExecuteNonQueryAsync(); + } + } + protected async Task CalculatePrices() { using var cnx = await AppDbContext.ConnectAsync(); @@ -81,7 +112,9 @@ namespace Elwig.Helpers.Billing { LEFT JOIN delivery_part_modifier p ON (p.year, p.did, p.dpnr) = (d.year, d.did, d.dpnr) LEFT JOIN modifier m ON m.modid = p.modid WHERE d.year = {Year} - ON CONFLICT DO UPDATE SET mod_abs = mod_abs + excluded.mod_abs, mod_rel = mod_rel + excluded.mod_rel; + ON CONFLICT DO UPDATE + SET mod_abs = mod_abs + excluded.mod_abs, + mod_rel = mod_rel + excluded.mod_rel """; await cmd.ExecuteNonQueryAsync(); }