Documents: Add CreditNote
This commit is contained in:
86
Elwig/Documents/CreditNote.cshtml
Normal file
86
Elwig/Documents/CreditNote.cshtml
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
@using RazorLight
|
||||||
|
@inherits TemplatePage<Elwig.Documents.CreditNote>
|
||||||
|
@model Elwig.Documents.CreditNote
|
||||||
|
@{ Layout = "BusinessDocument"; }
|
||||||
|
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-creditnote.css"/>
|
||||||
|
@{
|
||||||
|
var bucketNum = Model.BucketNames.Length;
|
||||||
|
}
|
||||||
|
<main>
|
||||||
|
<div class="date">@Model.Location, am @($"{Model.Date:dd.MM.yyyy}")</div>
|
||||||
|
<h1>@Model.Title</h1>
|
||||||
|
<table class="credit">
|
||||||
|
<colgroup>
|
||||||
|
<col style="width: 24mm;"/>
|
||||||
|
<col style="width: 6mm;"/>
|
||||||
|
<col style="width: 31mm;"/>
|
||||||
|
<col style="width: 15mm;"/>
|
||||||
|
<col style="width: 8mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 12mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 12mm;"/>
|
||||||
|
<col style="width: 15mm;"/>
|
||||||
|
<col style="width: 17mm;"/>
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th rowspan="3" style="text-align: left;">Lieferschein-Nr.</th>
|
||||||
|
<th rowspan="3">Pos.</th>
|
||||||
|
<th rowspan="3" style="text-align: left;">Sorte</th>
|
||||||
|
<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 rowspan="2">Betrag</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Abs.</th>
|
||||||
|
<th>Rel.</th>
|
||||||
|
<th>Gewicht</th>
|
||||||
|
<th>Preis</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>[°Oe]</th>
|
||||||
|
<th>[°KMW]</th>
|
||||||
|
<th>[@Model.CurrencySymbol/kg]</th>
|
||||||
|
<th>[%]</th>
|
||||||
|
<th>[kg]</th>
|
||||||
|
<th>[@Model.CurrencySymbol/kg]</th>
|
||||||
|
<th>[@Model.CurrencySymbol]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@{
|
||||||
|
string FormatRow(int? weight, decimal? amount) {
|
||||||
|
var w = weight == null || weight == 0 ? "-" : $"{weight:N0}";
|
||||||
|
return $"<td class='weight'>{w}</td><td class='amount'>{amount?.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)))}</td>";
|
||||||
|
}
|
||||||
|
string? last = null;
|
||||||
|
}
|
||||||
|
@foreach (var part in Model.Parts) {
|
||||||
|
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>
|
||||||
|
@for (int i = 1; i < bucketNum; i++) {
|
||||||
|
<tr class="@(i == bucketNum - 1 ? "last" : "")">
|
||||||
|
@Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(i), pmt?.Prices?.ElementAtOrDefault(i)))
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
last = part.SortId;
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</main>
|
39
Elwig/Documents/CreditNote.cshtml.cs
Normal file
39
Elwig/Documents/CreditNote.cshtml.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Elwig.Documents {
|
||||||
|
public class CreditNote : BusinessDocument {
|
||||||
|
|
||||||
|
public Credit Credit;
|
||||||
|
public string? Text;
|
||||||
|
public string CurrencySymbol;
|
||||||
|
public string[] BucketNames;
|
||||||
|
public int Precision;
|
||||||
|
public IEnumerable<DeliveryPart> Parts;
|
||||||
|
|
||||||
|
public CreditNote(Credit c, AppDbContext ctx) : base($"Traubengutschrift Nr. {c.TgId} – {c.Payment.Variant.Name}", c.Member) {
|
||||||
|
UseBillingAddress = true;
|
||||||
|
Credit = c;
|
||||||
|
Aside = Aside.Replace("</table>", "") +
|
||||||
|
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
|
||||||
|
$"<tr><th>TG-Nr.</th><td>{c.TgId}</td></tr>" +
|
||||||
|
$"<tr><th>Überw. am</th><td>{c.Payment.Variant.TransferDate:dd.MM.yyyy}</td></tr>" +
|
||||||
|
$"<tr><th>Datum/Zeit</th><td>{c.ModifiedTimestamp:dd.MM.yyyy} / {c.ModifiedTimestamp:HH:mm}</td></tr>" +
|
||||||
|
$"</tbody></table>";
|
||||||
|
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;
|
||||||
|
Precision = c.Payment.Variant.Season.Precision;
|
||||||
|
Parts = ctx.DeliveryParts.FromSql($"""
|
||||||
|
SELECT p.*
|
||||||
|
FROM v_delivery v
|
||||||
|
JOIN delivery_part p ON (p.year, p.did, p.dpnr) = (v.year, v.did, v.dpnr)
|
||||||
|
WHERE (v.year, v.mgnr) = ({c.Year}, {c.Member.MgNr})
|
||||||
|
ORDER BY sortid, LENGTH(attributes) DESC, attributes, kmw DESC, date, time, dpnr
|
||||||
|
""").ToList();
|
||||||
|
}
|
||||||
|
}}
|
@ -49,6 +49,8 @@ namespace Elwig.Documents {
|
|||||||
name = "BusinessLetter";
|
name = "BusinessLetter";
|
||||||
} else if (this is DeliveryNote) {
|
} else if (this is DeliveryNote) {
|
||||||
name = "DeliveryNote";
|
name = "DeliveryNote";
|
||||||
|
} else if (this is CreditNote) {
|
||||||
|
name = "CreditNote";
|
||||||
} else {
|
} else {
|
||||||
throw new InvalidOperationException("Invalid document object");
|
throw new InvalidOperationException("Invalid document object");
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ namespace Elwig.Documents {
|
|||||||
await e.CompileTemplateAsync("BusinessDocument");
|
await e.CompileTemplateAsync("BusinessDocument");
|
||||||
await e.CompileTemplateAsync("BusinessLetter");
|
await e.CompileTemplateAsync("BusinessLetter");
|
||||||
await e.CompileTemplateAsync("DeliveryNote");
|
await e.CompileTemplateAsync("DeliveryNote");
|
||||||
|
await e.CompileTemplateAsync("CreditNote");
|
||||||
|
|
||||||
Engine = e;
|
Engine = e;
|
||||||
evtHandler();
|
evtHandler();
|
||||||
|
64
Elwig/Documents/style-creditnote.css
Normal file
64
Elwig/Documents/style-creditnote.css
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
|
||||||
|
table.credit {
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit th,
|
||||||
|
table.credit td {
|
||||||
|
padding: 0 0.25mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit thead {
|
||||||
|
font-size: 8pt
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit thead th {
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit td {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .oe,
|
||||||
|
table.credit .kmw {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .dpnr {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .amount,
|
||||||
|
table.credit .weight {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .rel,
|
||||||
|
table.credit .abs {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .amount.sum {
|
||||||
|
vertical-align: bottom;
|
||||||
|
padding-bottom: 1mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr:not(.first):not(.last) {
|
||||||
|
break-before: avoid;
|
||||||
|
break-after: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr.first td {
|
||||||
|
padding-top: 1mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr.last td {
|
||||||
|
padding-bottom: 1mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr.new {
|
||||||
|
border-top: 0.5pt solid black;
|
||||||
|
}
|
Reference in New Issue
Block a user