From 4bd378e048d0e1deb2d65f83e742920888ac392a Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 9 May 2024 19:12:27 +0200 Subject: [PATCH] [#32] PaymentVariantSummary: Add summary header --- Elwig/Documents/Document.Table.css | 1 + Elwig/Documents/PaymentVariantSummary.cs | 15 +- Elwig/Documents/PaymentVariantSummary.cshtml | 155 +++++++++++++++++- Elwig/Documents/PaymentVariantSummary.css | 4 + .../Models/Dtos/PaymentVariantSummaryData.cs | 2 +- Elwig/Windows/PaymentVariantsWindow.xaml.cs | 3 +- .../PaymentVariantSummaryTest.cs | 14 +- Tests/Resources/Sql/DocumentInsert.sql | 2 +- 8 files changed, 180 insertions(+), 16 deletions(-) diff --git a/Elwig/Documents/Document.Table.css b/Elwig/Documents/Document.Table.css index e56fda1..7f7f4a8 100644 --- a/Elwig/Documents/Document.Table.css +++ b/Elwig/Documents/Document.Table.css @@ -165,6 +165,7 @@ main table th.narrow { padding-right: 0; } +main table .tborder {border-top: var(--border-thickness) solid black;} main table .lborder {border-left: var(--border-thickness) solid black;} main table .rborder {border-right: var(--border-thickness) solid black;} diff --git a/Elwig/Documents/PaymentVariantSummary.cs b/Elwig/Documents/PaymentVariantSummary.cs index df73960..0c39a11 100644 --- a/Elwig/Documents/PaymentVariantSummary.cs +++ b/Elwig/Documents/PaymentVariantSummary.cs @@ -1,5 +1,7 @@ -using Elwig.Models.Dtos; +using Elwig.Helpers.Billing; +using Elwig.Models.Dtos; using Elwig.Models.Entities; +using System.Linq; namespace Elwig.Documents { public class PaymentVariantSummary : Document { @@ -8,12 +10,21 @@ namespace Elwig.Documents { public PaymentVariantSummaryData Data; public PaymentVar Variant; + public BillingData BillingData; public string CurrencySymbol; + public int MemberNum; + public int DeliveryNum; + public int DeliveryPartNum; - public PaymentVariantSummary(PaymentVar v, PaymentVariantSummaryData data) : base(v.Name) { + public PaymentVariantSummary(PaymentVar v, PaymentVariantSummaryData data) : + base($"{Name} {v.Year} - {v.Name}") { Variant = v; + BillingData = BillingData.FromJson(v.Data); Data = data; CurrencySymbol = v.Season.Currency.Symbol ?? v.Season.Currency.Code; + MemberNum = v.Credits.Count; + DeliveryNum = v.DeliveryPartPayments.DistinctBy(p => p.DeliveryPart.Delivery).Count(); + DeliveryPartNum = v.DeliveryPartPayments.Count; } } } diff --git a/Elwig/Documents/PaymentVariantSummary.cshtml b/Elwig/Documents/PaymentVariantSummary.cshtml index a32b6e3..97600e0 100644 --- a/Elwig/Documents/PaymentVariantSummary.cshtml +++ b/Elwig/Documents/PaymentVariantSummary.cshtml @@ -5,10 +5,157 @@ @{ Layout = "Document"; }
-

Auszahlungsvariante

+

Auszahlungsvariante Lese @Model.Variant.Year

@Model.Variant.Name

- - +
+ + + + + + + + + + @{ + //var sum1 = Model.Variant.DeliveryPartPayments.Sum(p => p.NetAmount); + //var sum2 = Model.Variant.Credits.Sum(p => p.); //Model.Variant.MemberPayments.Sum(p => p.Amount); + var modifiers = Model.Variant.DeliveryPartPayments.Sum(p => p.Amount - p.NetAmount); + var sum2 = Model.Variant.Credits.Sum(p => p.NetAmount); + var sum1 = sum2 - modifiers; + var payed = -Model.Variant.Credits.Sum(p => p.PrevNetAmount ?? 0m); + var netSum = Model.Variant.Credits.Sum(p => p.NetAmount) - Model.Variant.Credits.Sum(p => p.PrevNetAmount ?? 0m); + var vat = Model.Variant.Credits.Sum(p => p.VatAmount); + var grossSum = Model.Variant.Credits.Sum(p => p.GrossAmount); + var totalMods = Model.Variant.Credits.Sum(p => p.Modifiers ?? 0m); + var considered = -Model.Variant.Credits.Sum(p => p.PrevModifiers ?? 0m); + var totalSum = Model.Variant.Credits.Sum(p => p.Amount); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @{ + var weiRows = Model.Data.Rows.Where(r => r.QualityLevel == "Wein"); + var minWei = weiRows.Min(r => r.Ungeb.Price); + var maxWei = weiRows.Max(r => r.Ungeb.Price); + } + + + + + + + + @{ + var quwRows = Model.Data.Rows.Where(r => r.QualityLevel != "Wein"); + var minPrice = quwRows.Min(r => r.Ungeb.Price); + var maxPrice = quwRows.Max(r => r.Ungeb.Price); + } + + + + + + + + @{ + var gebRows = Model.Data.Rows + .Where(r => r.Geb.Price != null && r.Ungeb.Price != null) + .Select(r => r.Geb.Price - r.Ungeb.Price); + var minGeb = gebRows.Min(); + var maxGeb = gebRows.Max(); + } + + + + + + + + + + + + + + + + + + + + + + + + + +
AllgemeinBerücksichtigt
Name:@Model.Variant.NameZu-/Abschläge bei Lieferungen:@(Model.BillingData.ConsiderDelieryModifiers ? "Ja" : "Nein")
Beschr.:@Model.Variant.CommentPönalen bei Unterlieferungen (FB):@(Model.BillingData.ConsiderContractPenalties ? "Ja" : "Nein")
Datum:@($"{Model.Variant.Date:dd.MM.yyyy}")Strafen bei Unterlieferungen (GA):@(Model.BillingData.ConsiderTotalPenalty ? "Ja" : "Nein")
Überw.:@($"{Model.Variant.TransferDate:dd.MM.yyyy}")Automatische Nachzeichnung der GA:@(Model.BillingData.ConsiderAutoBusinessShares ? "Ja" : "Nein")
BeträgeStatistik
Zwischensumme:@Model.CurrencySymbol@($"{sum1:N2}")Lieferanten:@($"{Model.MemberNum:N0}")
Zu-/Abschläge (Lieferungen):@Utils.GetSign(modifiers)@Model.CurrencySymbol@($"{Math.Abs(modifiers):N2}")Lieferungen:@($"{Model.DeliveryNum:N0}")
Gesamtsumme:@Model.CurrencySymbol@($"{sum2:N2}")Teillieferungen:@($"{Model.DeliveryPartNum:N0}")
Bisher ausgezahlt:@Utils.GetSign(payed)@Model.CurrencySymbol@($"{Math.Abs(payed):N2}")
Nettosumme:@Model.CurrencySymbol@($"{netSum:N2}")Preis (abgewertet):@(minWei != maxWei ? $"{minWei:N4}~{maxWei:N4}" : $"{minWei:N4}") @Model.CurrencySymbol/kg
Mehrwertsteuer:@Utils.GetSign(vat)@Model.CurrencySymbol@($"{Math.Abs(vat):N2}")Preis (ungeb., nicht abgew.):@(minPrice != maxPrice ? $"{minPrice:N4}~{maxPrice:N4}" : $"{minPrice:N4}") @Model.CurrencySymbol/kg
Bruttosumme:@Model.CurrencySymbol@($"{grossSum:N2}")Gebunden-Zuschlag: + @(minGeb != maxGeb ? $"{minGeb:N4}~{maxGeb:N4} {Model.CurrencySymbol}/kg" : minGeb == 0 ? "-" : $"{minGeb:N4} {Model.CurrencySymbol}/kg") +
Abzüge (Strafen/Pönalen, GA, ...):@Utils.GetSign(totalMods)@Model.CurrencySymbol@($"{Math.Abs(totalMods):N2}")Menge (ungebunden):@($"{Model.Data.Rows.Sum(r => r.Ungeb.Weight):N0}") kg
Bereits berücksichtigte Abzüge:@Utils.GetSign(considered)@Model.CurrencySymbol@($"{Math.Abs(considered):N2}")Menge (gebunden):@($"{Model.Data.Rows.Sum(r => r.Geb.Weight):N0}") kg
Auszahlungsbetrag:@Model.CurrencySymbol@($"{totalSum:N2}")Gesamtmenge:@($"{Model.Data.Rows.Sum(r => r.Ungeb.Weight + r.Geb.Weight):N0}") kg
+ @@ -45,7 +192,7 @@ var rows = Model.Data.Rows .Where(r => r.Variety == row.Variety && r.Attribute == row.Attribute && r.Cultivation == row.Cultivation) .ToList(); - + diff --git a/Elwig/Documents/PaymentVariantSummary.css b/Elwig/Documents/PaymentVariantSummary.css index 617bd4c..bc2fbbb 100644 --- a/Elwig/Documents/PaymentVariantSummary.css +++ b/Elwig/Documents/PaymentVariantSummary.css @@ -13,5 +13,9 @@ h2 { } table.payment-variant { + margin-top: 10mm; +} + +table.payment-variant-data { break-before: page; } diff --git a/Elwig/Models/Dtos/PaymentVariantSummaryData.cs b/Elwig/Models/Dtos/PaymentVariantSummaryData.cs index ceb27a2..ce465fe 100644 --- a/Elwig/Models/Dtos/PaymentVariantSummaryData.cs +++ b/Elwig/Models/Dtos/PaymentVariantSummaryData.cs @@ -36,7 +36,7 @@ namespace Elwig.Models.Dtos { ); public PaymentVariantSummaryData(PaymentVar v, IEnumerable rows) : - base(PaymentVariantSummary.Name, PaymentVariantSummary.Name, v.Name, rows, FieldNames) { + base($"{PaymentVariantSummary.Name} {v.Year}", $"{PaymentVariantSummary.Name} Lese {v.Year}", v.Name, rows, FieldNames) { } public static async Task ForPaymentVariant(PaymentVar v, DbSet table) { diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index 749642d..4618dec 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -192,6 +192,7 @@ namespace Elwig.Windows { PaymentSum.Text = $"- {sym}"; } else { // all values in the credit table are stored with precision 2! + TotalSum.Text = $"{Utils.DecFromDb(await credits.SumAsync(c => c.NetAmountValue), 2):N2} {sym}"; VatSum.Text = $"{Utils.DecFromDb(await credits.SumAsync(c => c.VatAmountValue), 2):N2} {sym}"; DeductionSum.Text = $"{-Utils.DecFromDb(await credits.SumAsync(c => c.ModifiersValue ?? 0), 2):N2} {sym}"; PaymentSum.Text = $"{Utils.DecFromDb(await credits.SumAsync(c => c.AmountValue), 2):N2} {sym}"; @@ -353,7 +354,7 @@ namespace Elwig.Windows { try { using var ctx = new AppDbContext(); var data = await PaymentVariantSummaryData.ForPaymentVariant(v, ctx.PaymentVariantSummaryRows); - using var doc = new PaymentVariantSummary(v, data); + using var doc = new PaymentVariantSummary((await ctx.PaymentVariants.FindAsync(v.Year, v.AvNr))!, data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); diff --git a/Tests/DocumentTests/PaymentVariantSummaryTest.cs b/Tests/DocumentTests/PaymentVariantSummaryTest.cs index 427e04b..5d34bf5 100644 --- a/Tests/DocumentTests/PaymentVariantSummaryTest.cs +++ b/Tests/DocumentTests/PaymentVariantSummaryTest.cs @@ -13,17 +13,17 @@ namespace Tests.DocumentTests { var v = (await ctx.PaymentVariants.FindAsync(2020, 1))!; var data = await PaymentVariantSummaryData.ForPaymentVariant(v, ctx.PaymentVariantSummaryRows); using var doc = new PaymentVariantSummary(v, data); - var text = await Utils.GeneratePdfText(doc, true); + var text = await Utils.GeneratePdfText(doc); var table = text.Split('\n').Select(l => Regex.Split(l.Trim(), "[ ]{2,}")).Where(l => l.Length > 2).ToArray(); Assert.Multiple(() => { Assert.That(text, Contains.Substring("Auszahlungsvariante")); Assert.That(text, Contains.Substring(v.Name)); - Assert.That(table, Is.EqualTo(new string[][] { - [ "Gradation", "ungebunden", "gebunden", "Gesamt" ], - [ "[°Oe]", "[kg]", "[€/kg]", "[kg]", "[€/kg]", "[€]" ], - ["Grüner Veltliner", "3 219", "0", "1 609,50"], - ["Qualitätswein", "73", "3 219", "0,5000", "-", "-", "1 609,50"], - })); + Assert.That(text, Contains.Substring(""" + Gradation ungebunden gebunden Gesamt + [°Oe] [kg] [€/kg] [kg] [€/kg] [€] + Grüner Veltliner 3 219 0 1 609,50 + Qualitätswein 73 3 219 0,5000 - - 1 609,50 + """)); }); } } diff --git a/Tests/Resources/Sql/DocumentInsert.sql b/Tests/Resources/Sql/DocumentInsert.sql index 35b2b07..bb04eea 100644 --- a/Tests/Resources/Sql/DocumentInsert.sql +++ b/Tests/Resources/Sql/DocumentInsert.sql @@ -61,7 +61,7 @@ INSERT INTO delivery_part_bucket (year, did, dpnr, bktnr, discr, value) VALUES (2020, 5, 2, 0, '_', 2190); INSERT INTO payment_variant (year, avnr, name, date, transfer_date, test_variant, calc_time, comment, data) VALUES -(2020, 1, 'Probevariante', '2021-01-15', '2021-01-15', TRUE, NULL, NULL, '{}'); +(2020, 1, 'Probevariante', '2021-01-15', '2021-01-15', TRUE, NULL, NULL, '{"mode":"elwig","version":1,"payment":0.5,"curves":[]}'); INSERT INTO payment_delivery_part_bucket (year, did, dpnr, bktnr, avnr, price, amount) VALUES (2020, 1, 1, 0, 1, 5000, 16095000);
@hdr @($"{rows.Sum(r => r.Ungeb.Weight):N0}")