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 $"";
}
}
}