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();
}