121 lines
6.1 KiB
C#
121 lines
6.1 KiB
C#
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 ? "" : " <i>(pauschaliert)</i>");
|
|
Aside = $"<table><colgroup><col span='1' style='width: 22.5mm;'/><col span='1' style='width: 42.5mm;'/></colgroup>" +
|
|
$"<thead><tr><th colspan='2'>Mitglied</th></tr></thead><tbody>" +
|
|
$"<tr><th>Mitglieds-Nr.</th><td>{m.MgNr}</td></tr>" +
|
|
$"<tr><th>Betriebs-Nr.</th><td>{m.LfbisNr}</td></tr>" +
|
|
$"<tr><th>UID</th><td>{uid}</td></tr>" +
|
|
$"</tbody></table>";
|
|
}
|
|
|
|
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<string, MemberBucket> buckets) {
|
|
return "";
|
|
}
|
|
|
|
private static string FormatRow(int obligation, int right, int delivery, int? payment = null, bool isGa = false, bool showPayment = false) {
|
|
payment ??= delivery;
|
|
var baseline = showPayment ? payment : delivery;
|
|
return $"<td>{(obligation == 0 ? "-" : $"{obligation:N0}")}</td>" +
|
|
$"<td>{(right == 0 ? "-" : $"{right:N0}")}</td>" +
|
|
$"<td>{(baseline < obligation ? $"<b>{obligation - baseline:N0}</b>" : "-")}</td>" +
|
|
$"<td>{(baseline >= obligation && delivery <= right ? $"{right - delivery:N0}" : "-")}</td>" +
|
|
$"<td>{(obligation == 0 && right == 0 ? "-" : (delivery > right ? ((isGa ? "<b>" : "") + $"{delivery - right:N0}" + (isGa ? "</b>" : "")) : "-"))}</td>" +
|
|
(showPayment ? $"<td>{(isGa ? "" : obligation == 0 && right == 0 ? "-" : $"{payment:N0}")}</td>" : "") +
|
|
$"<td>{delivery:N0}</td>";
|
|
}
|
|
|
|
private static string FormatRow(MemberBucket bucket, bool isGa = false, bool showPayment = false) {
|
|
return FormatRow(bucket.Obligation, bucket.Right, bucket.Delivery, bucket.Payment, isGa, showPayment);
|
|
}
|
|
|
|
public string PrintBucketTable(Season season, Dictionary<string, MemberBucket> buckets, bool includePayment = false, bool isTiny = false, IEnumerable<string>? filter = null) {
|
|
int[] colGroups = includePayment ? [45, 17, 17, 17, 19, 16, 17, 17] : [45, 20, 20, 20, 20, 20, 20];
|
|
string tbl = "<colgroup>\n" + string.Join("\n", colGroups.Select(g => $"<col style=\"width: {g}mm;\"/>")) + "\n</colgroup>\n";
|
|
tbl += $"""
|
|
<thead>
|
|
<tr>
|
|
<th><b>Lese {season.Year}</b> per {Date:dd.MM.yyyy} [kg]</th>
|
|
<th>Lieferpflicht</th>
|
|
<th>Lieferrecht</th>
|
|
<th>Unterliefert</th>
|
|
<th>Noch lieferbar</th>
|
|
<th>Überliefert</th>
|
|
{(includePayment ? "<th>Zugeteilt</th>" : "")}
|
|
<th>Geliefert</th>
|
|
</tr>
|
|
</thead>
|
|
""";
|
|
|
|
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<tbody>\n";
|
|
tbl += $"<tr><th>Gesamtlieferung lt. gez. GA</th>{FormatRow(
|
|
Member.BusinessShares * season.MinKgPerBusinessShare,
|
|
Member.BusinessShares * season.MaxKgPerBusinessShare,
|
|
Member.Deliveries.Where(d => d.Year == season.Year).Sum(d => d.Weight),
|
|
isGa: true, showPayment: includePayment
|
|
)}</tr>";
|
|
if (fbs.Any()) {
|
|
tbl += $"<tr class=\"subheading{(filter == null ? " border" : "")}\"><th colspan=\"{(includePayment ? 8 : 7)}\">" +
|
|
$"Flächenbindungen{(vtr.Any() ? " (inkl. Verträge)" : "")}:</th></tr>";
|
|
foreach (var (id, b) in fbs) {
|
|
tbl += $"<tr><th>{b.Name}</th>{FormatRow(b, showPayment: includePayment)}</tr>";
|
|
}
|
|
}
|
|
if (vtr.Any()) {
|
|
tbl += $"<tr class=\"subheading{(filter == null ? " border" : "")}\"><th colspan=\"{(includePayment ? 8 : 7)}\">" +
|
|
"Verträge:</th></tr>";
|
|
foreach (var (id, b) in vtr) {
|
|
tbl += $"<tr><th>{b.Name}</th>{FormatRow(b, showPayment: includePayment)}</tr>";
|
|
}
|
|
}
|
|
tbl += "\n</tbody>\n";
|
|
|
|
return $"<table class=\"{(isTiny ? "tiny" : "small")} number cohere\">\n" + tbl + "\n</table>";
|
|
}
|
|
}
|
|
}
|