using Elwig.Helpers; using Elwig.Models.Entities; using System.Collections.Generic; using System.Linq; namespace Elwig.Documents { public abstract class BusinessDocument : Document { public bool ShowDateAndLocation = false; public Member Member; public bool IncludeSender = false; public bool UseBillingAddress = false; public string Aside; public string? Location; public BusinessDocument(string title, Member m, bool includeSender = false) : base(title) { Member = m; Location = App.BranchLocation; IncludeSender = includeSender; var uid = (m.UstIdNr ?? "-") + (m.IsBuchführend ? "" : " (pauschaliert)"); Aside = $"" + $"" + $"" + $"" + $"" + $"
Mitglied
Mitglieds-Nr.{m.MgNr}
Betriebs-Nr.{m.LfbisNr}
UID{uid}
"; } public string Address { get { IAddress addr = (Member.BillingAddress != null && UseBillingAddress) ? Member.BillingAddress : Member; var plz = addr.PostalDest.AtPlz; return (addr is BillingAddr ? $"{addr.Name}\n" : "") + $"{Member.AdministrativeName}\n{addr.Address}\n{plz?.Plz} {plz?.Ort.Name.Split(",")[0]}\n{addr.PostalDest.Country.Name}"; } } public string PrintSortenaufteilung(int year, Dictionary buckets) { return ""; } private enum RowMode { GA_CONFIRMATION, CONFIRMATION, GA_NOTE, NOTE } private static string FormatRow(RowMode mode, int obligation, int right, int delivery, int? payment = null) { var isGa = (mode == RowMode.GA_CONFIRMATION || mode == RowMode.GA_NOTE); var showPayment = (mode == RowMode.GA_CONFIRMATION || mode == RowMode.CONFIRMATION); payment ??= delivery; var baseline = showPayment ? payment : delivery; return $"{(obligation == 0 ? "-" : $"{obligation:N0}")}" + $"{(right == 0 ? "-" : $"{right:N0}")}" + $"{(baseline < obligation ? $"{obligation - baseline:N0}" : "-")}" + $"{(baseline >= obligation && delivery <= right ? $"{right - delivery:N0}" : "-")}" + $"{(obligation == 0 && right == 0 ? "-" : (delivery > right ? ((isGa ? "" : "") + $"{delivery - right:N0}" + (isGa ? "" : "")) : "-"))}" + (showPayment ? $"{(isGa ? "" : obligation == 0 && right == 0 ? "-" : $"{payment:N0}")}" : "") + $"{delivery:N0}"; } private static string FormatRow(RowMode mode, MemberBucket bucket) { return FormatRow(mode, bucket.Obligation, bucket.Right, bucket.Delivery, bucket.Payment); } public string PrintBucketTable(Season season, Dictionary buckets, bool includePayment = false, bool isTiny = false, IEnumerable? filter = null) { int[] colGroups = includePayment ? [45, 17, 17, 17, 19, 16, 17, 17] : [45, 20, 20, 20, 20, 20, 20]; string tbl = "\n" + string.Join("\n", colGroups.Select(g => $"")) + "\n\n"; tbl += $""" Lese {season.Year} per {Date:dd.MM.yyyy} [kg] Lieferpflicht Lieferrecht Unterliefert Noch lieferbar Überliefert {(includePayment ? "Zugeteilt" : "")} Geliefert """; var mBuckets = buckets .Where(b => (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) .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); var rem = mBuckets .Where(b => !fbVars.Contains(b.Key)) .OrderBy(b => b.Value.Name); tbl += "\n\n"; tbl += $"Gesamtlieferung lt. gez. GA{FormatRow( includePayment ? RowMode.GA_CONFIRMATION : RowMode.GA_NOTE, Member.BusinessShares * season.MinKgPerBusinessShare, Member.BusinessShares * season.MaxKgPerBusinessShare, Member.Deliveries.Where(d => d.Year == season.Year).Sum(d => d.Weight) )}"; if (fbs.Any()) { tbl += $"" + $"Flächenbindungen{(vtr.Any() ? " (inkl. Verträge)" : "")}:"; foreach (var (id, b) in fbs) { tbl += $"{b.Name}{FormatRow(includePayment ? RowMode.CONFIRMATION : RowMode.NOTE, b)}"; } } if (vtr.Any()) { tbl += $"" + "Verträge:"; foreach (var (id, b) in vtr) { tbl += $"{b.Name}{FormatRow(includePayment ? RowMode.CONFIRMATION : RowMode.NOTE, b)}"; } } tbl += "\n\n"; return $"\n" + tbl + "\n
"; } } }