Billing: Add feature to calculate member/delivery bins
This commit is contained in:
@ -4,7 +4,7 @@
|
||||
@{ Layout = "BusinessDocument"; }
|
||||
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-creditnote.css"/>
|
||||
@{
|
||||
var bucketNum = Model.BucketNames.Length;
|
||||
var binNum = Model.BinNames.Length;
|
||||
}
|
||||
<main>
|
||||
<h1>@Model.Title</h1>
|
||||
@ -30,7 +30,7 @@
|
||||
<th rowspan="3" style="text-align: left;">Attribut(e)</th>
|
||||
<th rowspan="2" colspan="2">Gradation</th>
|
||||
<th colspan="2">Zu-/Abschläge</th>
|
||||
<th colspan="2">@Raw(string.Join("<br/>", Model.BucketNames))</th>
|
||||
<th colspan="2">@Raw(string.Join("<br/>", Model.BinNames))</th>
|
||||
<th rowspan="2">Betrag</th>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -61,21 +61,21 @@
|
||||
var pmt = part.Payment;
|
||||
var abs = pmt?.ModAbs == null || pmt?.ModAbs == 0 ? "-" : pmt?.ModAbs.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)));
|
||||
var rel = pmt?.ModRel == null || pmt?.ModRel == 0 ? "-" : $"{pmt?.ModRel * 100:0.00##}";
|
||||
<tr class="first @(bucketNum <= 1 ? "last" : "") @(last != null && last != part.SortId ? "new" : "")">
|
||||
<td rowspan="@bucketNum" class="lsnr">@part.Delivery.LsNr</td>
|
||||
<td rowspan="@bucketNum" class="dpnr">@part.DPNr</td>
|
||||
<td rowspan="@bucketNum" class="variant">@part.Variant.Name</td>
|
||||
<td rowspan="@bucketNum" class="attribute">@string.Join(" / ", part.PartAttributes.Select(a => a.AttrId))</td>
|
||||
<td rowspan="@bucketNum" class="oe">@($"{part.Oe:N0}")</td>
|
||||
<td rowspan="@bucketNum" class="kmw">@($"{part.Kmw:N1}")</td>
|
||||
<td rowspan="@bucketNum" class="abs">@abs</td>
|
||||
<td rowspan="@bucketNum" class="rel">@rel</td>
|
||||
@Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(0), pmt?.Prices?.ElementAtOrDefault(0)))
|
||||
<td rowspan="@bucketNum" class="amount sum">@($"{pmt?.Amount:N2}")</td>
|
||||
<tr class="first @(binNum <= 1 ? "last" : "") @(last != null && last != part.SortId ? "new" : "")">
|
||||
<td rowspan="@binNum" class="lsnr">@part.Delivery.LsNr</td>
|
||||
<td rowspan="@binNum" class="dpnr">@part.DPNr</td>
|
||||
<td rowspan="@binNum" class="variant">@part.Variant.Name</td>
|
||||
<td rowspan="@binNum" class="attribute">@string.Join(" / ", part.PartAttributes.Select(a => a.AttrId))</td>
|
||||
<td rowspan="@binNum" class="oe">@($"{part.Oe:N0}")</td>
|
||||
<td rowspan="@binNum" class="kmw">@($"{part.Kmw:N1}")</td>
|
||||
<td rowspan="@binNum" class="abs">@abs</td>
|
||||
<td rowspan="@binNum" class="rel">@rel</td>
|
||||
@Raw(FormatRow(pmt?.DeliveryPart.Bins?.ElementAtOrDefault(0), pmt?.Prices?.ElementAtOrDefault(0)))
|
||||
<td rowspan="@binNum" class="amount sum">@($"{pmt?.Amount:N2}")</td>
|
||||
</tr>
|
||||
@for (int i = 1; i < bucketNum; i++) {
|
||||
<tr class="@(i == bucketNum - 1 ? "last" : "")">
|
||||
@Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(i), pmt?.Prices?.ElementAtOrDefault(i)))
|
||||
@for (int i = 1; i < binNum; i++) {
|
||||
<tr class="@(i == binNum - 1 ? "last" : "")">
|
||||
@Raw(FormatRow(pmt?.DeliveryPart.Bins?.ElementAtOrDefault(i), pmt?.Prices?.ElementAtOrDefault(i)))
|
||||
</tr>
|
||||
}
|
||||
last = part.SortId;
|
||||
|
@ -10,7 +10,7 @@ namespace Elwig.Documents {
|
||||
public Credit Credit;
|
||||
public string? Text;
|
||||
public string CurrencySymbol;
|
||||
public string[] BucketNames;
|
||||
public string[] BinNames;
|
||||
public int Precision;
|
||||
public IEnumerable<DeliveryPart> Parts;
|
||||
|
||||
@ -27,7 +27,7 @@ namespace Elwig.Documents {
|
||||
Text = App.Client.TextDeliveryNote;
|
||||
DocumentId = $"Tr.-Gutschr. {c.TgId}";
|
||||
CurrencySymbol = c.Payment.Variant.Season.Currency.Symbol ?? c.Payment.Variant.Season.Currency.Code;
|
||||
BucketNames = c.Payment.Variant.BucketNames;
|
||||
BinNames = c.Payment.Variant.Season.BinNames;
|
||||
Precision = c.Payment.Variant.Season.Precision;
|
||||
Parts = ctx.DeliveryParts.FromSql($"""
|
||||
SELECT p.*
|
||||
|
@ -109,7 +109,7 @@
|
||||
$"<td>{sum:N0}</td>";
|
||||
}
|
||||
var sortids = Model.Delivery.Parts.Select(p => p.SortId).ToList();
|
||||
var buckets = Model.MemberBuckets.GroupBy(b => b.Item1[..2]).ToDictionary(g => g.Key, g => g.Count());
|
||||
var bins = Model.MemberBins.GroupBy(b => b.Item1[..2]).ToDictionary(g => g.Key, g => g.Count());
|
||||
}
|
||||
<tr>
|
||||
<th>Gesamtlieferung lt. gez. GA</th>
|
||||
@ -119,8 +119,8 @@
|
||||
<tr class="subheading">
|
||||
<th>Flächenbindungen:</th>
|
||||
</tr>
|
||||
@foreach (var (id, name, right, obligation, sum) in Model.MemberBuckets.OrderBy(b => b.Item1)) {
|
||||
if (right > 0 || obligation > 0 || (sum > 0 && buckets[id[..2]] > 1 && !id.EndsWith('_'))) {
|
||||
@foreach (var (id, name, right, obligation, sum) in Model.MemberBins.OrderBy(b => b.Item1)) {
|
||||
if (right > 0 || obligation > 0 || (sum > 0 && bins[id[..2]] > 1 && !id.EndsWith('_'))) {
|
||||
<tr class="@(sortids.Contains(id[..2]) ? "" : "optional")">
|
||||
<th>@name</th>
|
||||
@Raw(FormatRow(obligation, right, sum))
|
||||
|
@ -7,7 +7,7 @@ namespace Elwig.Documents {
|
||||
|
||||
public Delivery Delivery;
|
||||
public string? Text;
|
||||
public IEnumerable<(string, string, int, int, int)> MemberBuckets;
|
||||
public IEnumerable<(string, string, int, int, int)> MemberBins;
|
||||
|
||||
// 0 - none
|
||||
// 1 - GA only
|
||||
@ -27,7 +27,7 @@ namespace Elwig.Documents {
|
||||
$"</tbody></table>";
|
||||
Text = App.Client.TextDeliveryNote;
|
||||
DocumentId = d.LsNr;
|
||||
MemberBuckets = ctx.GetMemberBuckets(d.Member, d.Year).GetAwaiter().GetResult();
|
||||
MemberBins = ctx.GetMemberBins(d.Member, d.Year).GetAwaiter().GetResult();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user