From 1bdb7183edaa9fa3a4132be21df77fac81813073 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 21 Dec 2023 22:24:04 +0100 Subject: [PATCH] [#5][#17][#23] MemberDataSheet: Overhaul entire MemberDataSheet --- Elwig/Documents/BusinessDocument.cs | 52 ++-- Elwig/Documents/BusinessDocument.css | 5 +- Elwig/Documents/Document.Table.css | 36 ++- Elwig/Documents/MemberDataSheet.cshtml | 359 ++++++++----------------- Elwig/Documents/MemberDataSheet.css | 80 +----- 5 files changed, 198 insertions(+), 334 deletions(-) diff --git a/Elwig/Documents/BusinessDocument.cs b/Elwig/Documents/BusinessDocument.cs index 04820cc..4da50ed 100644 --- a/Elwig/Documents/BusinessDocument.cs +++ b/Elwig/Documents/BusinessDocument.cs @@ -36,7 +36,7 @@ namespace Elwig.Documents { } private static string GetColGroup(IEnumerable cols) { - return "\n" + string.Join("\n", cols.Select(g => $"")) + "\n\n"; + return "\n" + string.Join("\n", cols.Select(g => $"")) + "\n\n"; } public static string PrintSortenaufteilung(Dictionary buckets) { @@ -80,9 +80,19 @@ namespace Elwig.Documents { return "" + tbl + "
"; } - private static string FormatRow(int obligation, int right, int delivery, int? payment = null, bool isGa = false, bool showPayment = false) { + private static string FormatRow( + int obligation, int right, int delivery, int? payment = null, int? area = null, + bool isGa = false, bool showPayment = false, bool showArea = false + ) { payment ??= delivery; var baseline = showPayment ? payment : delivery; + + if (showArea) { + return $"{(area == null ? "" : $"{area:N0}")}" + + $"{obligation:N0}" + + $"{right:N0}"; + } + return $"{(obligation == 0 ? "-" : $"{obligation:N0}")}" + $"{(right == 0 ? "-" : $"{right:N0}")}" + $"{(baseline < obligation ? $"{obligation - baseline:N0}" : "-")}" + @@ -92,29 +102,41 @@ namespace Elwig.Documents { $"{delivery:N0}"; } - private static string FormatRow(MemberBucket bucket, bool isGa = false, bool showPayment = false) { - return FormatRow(bucket.Obligation, bucket.Right, bucket.Delivery, bucket.Payment, isGa, showPayment); + private static string FormatRow(MemberBucket bucket, bool isGa = false, bool showPayment = false, bool showArea = false) { + return FormatRow(bucket.Obligation, bucket.Right, bucket.Delivery, bucket.Payment, bucket.Area, isGa, showPayment, showArea); } - public string PrintBucketTable(Season season, Dictionary buckets, bool includePayment = false, bool isTiny = false, IEnumerable? filter = null) { - string tbl = GetColGroup(includePayment ? [45, 17, 17, 17, 19, 16, 17, 17] : [45, 20, 20, 20, 20, 20, 20]); + public string PrintBucketTable( + Season season, Dictionary buckets, + bool includeDelivery = true, bool includePayment = false, + bool isTiny = false, IEnumerable? filter = null + ) { + includePayment = includePayment && includeDelivery; + string tbl = GetColGroup(!includeDelivery ? [105, 20, 20, 20] : includePayment ? [45, 17, 17, 17, 19, 16, 17, 17] : [45, 20, 20, 20, 20, 20, 20]); tbl += $""" - Lese {season.Year} per {Date:dd.MM.yyyy} [kg] + + {(includeDelivery ? "Lese " + season.Year : "Zusammengefasste Flächenbindungen")} + per {Date:dd.MM.yyyy} {(includeDelivery ? "[kg]" : "")} + + {(!includeDelivery ? "Fläche" : "")} Lieferpflicht Lieferrecht - Unterliefert - Noch lieferbar - Überliefert + {(includeDelivery ? "Unterliefert" : "")} + {(includeDelivery ? "Noch lieferbar" : "")} + {(includeDelivery ? "Geliefert" : "")} {(includePayment ? "Zugeteilt" : "")} - Geliefert + {(includeDelivery ? "Geliefert" : "")} + {(!includeDelivery ? "[m²][kg][kg]" : "")} """; var mBuckets = buckets - .Where(b => (b.Value.Right > 0 || b.Value.Obligation > 0 || b.Value.Delivery > 0) && (filter == null || filter.Contains(b.Key[..2]))) + .Where(b => ((!includeDelivery && b.Value.Area > 0) || + (includeDelivery && (b.Value.Right > 0 || b.Value.Obligation > 0 || b.Value.Delivery > 0))) && + (filter == null || filter.Contains(b.Key[..2]))) .ToList(); var fbVars = mBuckets .Where(b => b.Value.Right > 0 || b.Value.Obligation > 0) @@ -136,20 +158,20 @@ namespace Elwig.Documents { Member.BusinessShares * season.MinKgPerBusinessShare, Member.BusinessShares * season.MaxKgPerBusinessShare, Member.Deliveries.Where(d => d.Year == season.Year).Sum(d => d.Weight), - isGa: true, showPayment: includePayment + isGa: true, showPayment: includePayment, showArea: !includeDelivery )}"; if (fbs.Any()) { tbl += $"" + $"Flächenbindungen{(vtr.Any() ? " (inkl. Verträge)" : "")}:"; foreach (var (id, b) in fbs) { - tbl += $"{b.Name}{FormatRow(b, showPayment: includePayment)}"; + tbl += $"{b.Name}{FormatRow(b, showPayment: includePayment, showArea: !includeDelivery)}"; } } if (vtr.Any()) { tbl += $"" + "Verträge:"; foreach (var (id, b) in vtr) { - tbl += $"{b.Name}{FormatRow(b, showPayment: includePayment)}"; + tbl += $"{b.Name}{FormatRow(b, showPayment: includePayment, showArea: !includeDelivery)}"; } } tbl += "\n\n"; diff --git a/Elwig/Documents/BusinessDocument.css b/Elwig/Documents/BusinessDocument.css index a06ef88..3331664 100644 --- a/Elwig/Documents/BusinessDocument.css +++ b/Elwig/Documents/BusinessDocument.css @@ -95,7 +95,10 @@ main > *:first-child { margin-top: 0; } -main h1, .main-wrapper p { +main h1, +main h2, +main h3, +.main-wrapper p { font-size: 12pt; margin: 1em 0; text-align: justify; diff --git a/Elwig/Documents/Document.Table.css b/Elwig/Documents/Document.Table.css index 501254d..9713e3c 100644 --- a/Elwig/Documents/Document.Table.css +++ b/Elwig/Documents/Document.Table.css @@ -10,6 +10,10 @@ main table.tiny { margin-bottom: 5mm; } +main table.border { + border: 0.5pt solid black; +} + main table tr { break-inside: avoid; } @@ -47,9 +51,12 @@ main table th { main table tbody { } -main table tbody .small { +main table .small { font-size: 8pt; } +main table .large { + font-size: 12pt; +} main table.number td, main table.number th { @@ -76,16 +83,32 @@ main table.cohere { break-inside: avoid; } +main table tr.subheading th, +main table tr.subheading td { + font-weight: bold; +} + main table tr.subheading th { text-align: left; - font-weight: bold; font-size: 10pt; } + main table.small tr.subheading th, -main table.tiny tr.subheading th { +main table.small tr.subheading td, +main table.tiny tr.subheading th, +main table.tiny tr.subheading td { font-size: 8pt; } +main table tr.sectionheading th { + padding-top: 1mm; + padding-bottom: 1mm; + font-weight: bold; + text-align: center; + font-size: 10pt; + border-top: 0.5pt solid black; +} + main table.number thead tr:first-child th:first-child { text-align: left; } @@ -107,7 +130,14 @@ main table th.unit { font-size: 8pt; } +main table.number th.unit { + padding-right: 2mm; +} + main table th.narrow { padding-left: 0; padding-right: 0; } + +main table .lborder {border-left: 0.5pt solid black;} +main table .rborder {border-right: 0.5pt solid black;} diff --git a/Elwig/Documents/MemberDataSheet.cshtml b/Elwig/Documents/MemberDataSheet.cshtml index 4278b75..d8b0ff5 100644 --- a/Elwig/Documents/MemberDataSheet.cshtml +++ b/Elwig/Documents/MemberDataSheet.cshtml @@ -1,4 +1,5 @@ @using RazorLight +@using Elwig.Helpers @inherits TemplatePage @model Elwig.Documents.MemberDataSheet @{ @@ -7,166 +8,128 @@

@Model.Title

- - - - +
Persönliche Daten
+ + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + - - + + - + + + + + + + + + + + + + + + + + + @{ + List subTbl1 = new(); + subTbl1.AddRange(Model.Member.EmailAddresses.Select(a => new[] { "E-Mail-Adresse", a.Address })); + subTbl1.AddRange(Model.Member.TelephoneNumbers.Select(n => new[] { Utils.PhoneNrTypeToString(n.Type), n.Number })); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @foreach (var e in Model.Member.EmailAddresses) { - var emailNumber = Model.Member.EmailAddresses.Count > 1 ? 1 : 0; - - - - - emailNumber++; + List subTbl2 = new(); + subTbl2.Add(new[] { "IBAN", Model.Member.Iban != null ? Elwig.Helpers.Utils.FormatIban(Model.Member.Iban) : null }); + subTbl2.Add(new[] { "BIC", Model.Member.Bic }); } - @foreach (var k in Model.Member.TelephoneNumbers) { + @for (int i = 0; i < Math.Max(subTbl1.Count, subTbl2.Count); i++) { - @if (k.Type.Equals("landline")) { - - } else if (k.Type.Equals("mobile")) { - - } else if (k.Type.Equals("fax")) { - - } - + + + + } - - - - - - + - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + +
Persönliche Daten
Mitglieds-Nr.@Model.Member.MgNrVorgänger MgNr.@Model.Member.PredecessorMgNrTitelVornameNachnameTitel
Titel (vorangestellt)@Model.Member.PrefixTitel (nachgestellt)@Model.Member.Suffix@Model.Member.Prefix@Model.Member.GivenName @Model.Member.MiddleName@Model.Member.FamilyName@Model.Member.Suffix
Vorname@Model.Member.GivenNameNachname@Model.Member.FamilyNameMitglieds-Nr.:@Model.Member.MgNrGeburtsjahr/-tag:@(string.Join('.', Model.Member.Birthday?.Split('-')?.Reverse() ?? Array.Empty()))
Weitere Vornamen@Model.Member.MiddleNameAdresse:@Model.Member.Address
Geburtsjahr/-tag@(string.Join('.', Model.Member.Birthday?.Split('-')?.Reverse()??Array.Empty()))PLZ/Ort:@Model.Member.PostalDest.AtPlz?.Plz @Model.Member.PostalDest.AtPlz?.Dest (@Model.Member.PostalDest.AtPlz?.Ort.Name)
Rechnungsadresse (optional)
Name:@Model.Member.BillingAddress?.Name
Adresse:@Model.Member.BillingAddress?.Address
PLZ/Ort:@Model.Member.BillingAddress?.PostalDest.AtPlz?.Plz @Model.Member.BillingAddress?.PostalDest.AtPlz?.Dest @((Model.Member.BillingAddress != null && Model.Member.BillingAddress.PostalDest.AtPlz != null) ? "(" + Model.Member.BillingAddress?.PostalDest.AtPlz?.Ort.Name + ")" : "")
KontaktdatenBankverbindung
Anschrift
Adresse@Model.Member.Address
PLZ/Ort@Model.Member.PostalDest.AtPlz?.Plz @Model.Member.PostalDest.AtPlz?.Dest (@Model.Member.PostalDest.AtPlz?.Ort.Name)
Rechnungsadresse
Name@Model.Member.BillingAddress?.Name
Adresse@Model.Member.BillingAddress?.Address
PLZ/Ort@Model.Member.BillingAddress?.PostalDest.AtPlz?.Plz @Model.Member.BillingAddress?.PostalDest.AtPlz?.Dest @((Model.Member.BillingAddress != null && Model.Member.BillingAddress.PostalDest.AtPlz != null) ? "(" + Model.Member.BillingAddress?.PostalDest.AtPlz?.Ort.Name + ")" : "")
Kontaktdaten
E-Mail-Adresse @(emailNumber != 0 ? $"({emailNumber})" : "")@e.Address
Tel.-Nr. (Festnetz)Tel.-Nr. (mobil)Fax-Nr.@k.Number@(i < subTbl1.Count ? subTbl1[i][0] + ":" : "")@(i < subTbl1.Count ? subTbl1[i][1] : "")@(i < subTbl2.Count ? subTbl2[i][0] + ":" : "")@(i < subTbl2.Count ? subTbl2[i][1] : "")
Bankverbindung
Betrieb
IBAN@(Model.Member.Iban != null ? Elwig.Helpers.Utils.FormatIban(Model.Member.Iban) : "")
BIC@Model.Member.Bic
Betrieb
UID@Model.Member.UstIdNrBetriebs-Nr.Betriebs-Nr.: @Model.Member.LfbisNrUID:@Model.Member.UstIdNr
Buchführend@(Model.Member.IsBuchführend ? "Ja" : "Nein")Bio@(Model.Member.IsOrganic ? "Ja" : "Nein")
Genossenschaft
Eintritt@Model.Member.EntryDateAustritt@Model.Member.ExitDate
Aktiv@(Model.Member.IsActive ? "Ja" : "Nein")Geschäftsanteile@Model.Member.BusinessShares
Volllierferant@(Model.Member.IsVollLieferant ? "Ja" : "Nein")Funktionär@(Model.Member.IsFunktionär ? "Ja" : "Nein")
Stamm-Zweigstelle@Model.Member.Branch?.NameStammgemeindeStammgemeinde: @Model.Member.DefaultKg?.NameBuchführend:@(Model.Member.IsBuchführend ? "Ja" : "Nein")
Kontakt via Post@(Model.Member.ContactViaPost ? "Ja" : "Nein")Kontakt via E-Mail@(Model.Member.ContactViaEmail ? "Ja" : "Nein")(Katastralgemeinde mit dem größten Anteil an Weinbauflächen)Bio:@(Model.Member.IsOrganic ? "Ja" : "Nein") +
Genossenschaft
Status: + @(Model.Member.IsActive ? "Aktiv" : "Nicht aktiv") + + (@(Model.Member.ExitDate != null ? + $"{Model.Member.EntryDate:dd.MM.yyyy}–{Model.Member.ExitDate:dd.MM.yyyy}" : + $"seit {Model.Member.EntryDate:dd.MM.yyyy}")) + + Geschäftsanteile:@Model.Member.BusinessShares
Stamm-Zweigstelle:@Model.Member.Branch?.NameVolllierferant:@(Model.Member.IsVollLieferant ? "Ja" : "Nein")
Zusendungen via... + Post: @(Model.Member.ContactViaPost ? "Ja" : "Nein") – + E-Mail: @(Model.Member.ContactViaEmail ? "Ja" : "Nein") + Funktionär:@(Model.Member.IsFunktionär ? "Ja" : "Nein")
+ @Raw(Model.PrintBucketTable(Model.Season, Model.MemberBuckets, includeDelivery: false)) + @{ var areaComs = Model.Member.ActiveAreaCommitments.GroupBy(a => a.AreaComType).Select(group => new { AreaComType = group.Key, @@ -177,15 +140,15 @@ } @if (areaComs.Count != 0) { -

Flächenbindungen

+

Flächenbindungen

- - - - - - + + + + + + @@ -201,124 +164,32 @@ - @foreach (var contractType in areaComs) { - - + - - + + @foreach (var areaCom in contractType.AreaComs) { - - - - + + + + lastContract = contractType.AreaComType.DisplayName; } } - - - - - - - - -
+
@($"{contractType.AreaComType.WineVar.Name} {(contractType.AreaComType.WineAttr != null ? "(" + contractType.AreaComType.WineAttr + ")" : "")}") @($"{contractType.Size:N0}")@($"{contractType.Size:N0}")
@areaCom.Kg.AtKg.Name (@areaCom.Kg.AtKg.KgNr) @areaCom.Rd?.Name@areaCom.GstNr.Replace(",", ", ")@($"{areaCom.Area:N0}")@areaCom.WineCult.NameAb @areaCom.YearFrom@areaCom.GstNr.Replace(",", ", ").Replace("-", "–")@($"{areaCom.Area:N0}")@areaCom.WineCult.Name@(areaCom.YearTo == null ? $"ab {areaCom.YearFrom}" : $"{areaCom.YearFrom}–{areaCom.YearTo}")
Gesamt@($"{Model.Member.ActiveAreaCommitments.Select(a => a.Area).Sum():N0}")
- - - - - - - - - - - - - - - - - - - - - - - @{ - string FormatRow(int mode, int area, int obligation, int right) { - return $"" + - $"" + - $""; - } - var mBuckets = Model.MemberBuckets.Where(b => b.Value.Right > 0 || b.Value.Obligation > 0 || b.Value.Delivery > 0).ToList(); - var fbVars = mBuckets.Where(b => b.Value.Right > 0 || b.Value.Obligation > 0).Select(b => b.Key.Replace("_", "")).Order().ToArray(); - var fbs = mBuckets.Where(b => fbVars.Contains(b.Key) && b.Key.Length == 2).OrderBy(b => b.Value.Name); - var vtr = mBuckets.Where(b => fbVars.Contains(b.Key) && b.Key.Length > 2).OrderBy(b => b.Value.Name); - } - - - @Raw(FormatRow( - 0, - 0, - Model.Member.BusinessShares * Model.Season.MinKgPerBusinessShare, - Model.Member.BusinessShares * Model.Season.MaxKgPerBusinessShare - )) - - @if (fbs.Any()) { - - } - @foreach (var (id, b) in fbs) { - - - @Raw(FormatRow(2, b.Area, b.Obligation, b.Right)) - - } - @if (vtr.Any()) { - - } - @foreach (var (id, b) in vtr) { - - - @Raw(FormatRow(2, b.Area, b.Obligation, b.Right)) - - } - -
FlächeLieferpflichtLieferrecht
[m²][kg][kg]
{(mode == 0 || mode == 1 ? "" : area == 0 ? "-" : $"{area:N0}")}{(mode == 1 ? "" : obligation == 0 ? "-" : $"{obligation:N0}")}{(mode == 1 ? "" : right == 0 ? "-" : $"{right:N0}")}
Laut gezeichneten GA
Flächenbindungen:
@b.Name
Verträge:
@b.Name
- } else { - - - - - - - - - - - - - - - - - - - - - - + + + +
LieferpflichtLieferrecht
[kg][kg]
Laut gezeichneten GA@($"{Model.Member.BusinessShares * Model.Season.MinKgPerBusinessShare:N0}")@($"{Model.Member.BusinessShares * Model.Season.MaxKgPerBusinessShare:N0}")
Gesamt:@($"{Model.Member.ActiveAreaCommitments.Select(a => a.Area).Sum():N0}")
} -
\ No newline at end of file diff --git a/Elwig/Documents/MemberDataSheet.css b/Elwig/Documents/MemberDataSheet.css index 27eb02f..3ee0c00 100644 --- a/Elwig/Documents/MemberDataSheet.css +++ b/Elwig/Documents/MemberDataSheet.css @@ -1,82 +1,20 @@ -table.member { - border: 0.5pt solid black; + +h2 { + /*break-before: page;*/ } -table.member, table.area-commitements { - font-size: 10pt; -} - -table.member tbody th { - font-weight: normal; - font-style: italic; - text-align: left; -} - - -table.member thead, -table.member tbody { - border: 0.5pt solid black; +table.area-commitements { + margin-top: 0; } table.area-commitements td { - overflow: hidden; -} - -table.area-commitements thead tr th { - font-weight: normal; - font-style: italic; -} - -table.area-commitements tbody tr.contract-type { - margin-bottom: 10px; -} - -table.area-commitements tbody td { vertical-align: top; } -table.area-commitements tr.new th { - border-top: 0.5pt solid black; +table.area-commitements td.text { + white-space: normal; } -table.delivery-confirmation-stats { - font-size: 10pt; - break-inside: avoid; +table.area-commitements tr.sum { + font-size: 12pt; } - -table.delivery-confirmation-stats th, -table.delivery-confirmation-stats td { - padding: 0.125mm 0; - overflow: hidden; - white-space: nowrap; -} - -table.delivery-confirmation-stats tr.subheading th { - text-align: left; -} - -table.delivery-confirmation-stats thead th { - font-weight: normal; - font-style: italic; - text-align: right; - font-size: 10pt; -} - -table.delivery-confirmation-stats thead th:first-child { - text-align: left; -} - -table.delivery-confirmation-stats td { - text-align: right; -} - -table.delivery-confirmation-stats tbody th { - font-weight: normal; - font-style: italic; - text-align: left; -} - -table.delivery-confirmation-stats tr.subheading th { - font-weight: bold; - border-top: 0.5pt solid black; -} \ No newline at end of file