From 1a673f4b3a9625c62360597b9cacbf8b102e6ae4 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 12 Sep 2023 21:40:33 +0200 Subject: [PATCH] Documents: Add CreditNote --- Elwig/Documents/CreditNote.cshtml | 86 ++++++++++++++++++++++++++++ Elwig/Documents/CreditNote.cshtml.cs | 39 +++++++++++++ Elwig/Documents/Document.cshtml.cs | 2 + Elwig/Documents/Html.cs | 1 + Elwig/Documents/style-creditnote.css | 64 +++++++++++++++++++++ 5 files changed, 192 insertions(+) create mode 100644 Elwig/Documents/CreditNote.cshtml create mode 100644 Elwig/Documents/CreditNote.cshtml.cs create mode 100644 Elwig/Documents/style-creditnote.css diff --git a/Elwig/Documents/CreditNote.cshtml b/Elwig/Documents/CreditNote.cshtml new file mode 100644 index 0000000..f135e2f --- /dev/null +++ b/Elwig/Documents/CreditNote.cshtml @@ -0,0 +1,86 @@ +@using RazorLight +@inherits TemplatePage +@model Elwig.Documents.CreditNote +@{ Layout = "BusinessDocument"; } + +@{ + var bucketNum = Model.BucketNames.Length; +} +
+
@Model.Location, am @($"{Model.Date:dd.MM.yyyy}")
+

@Model.Title

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @{ + string FormatRow(int? weight, decimal? amount) { + var w = weight == null || weight == 0 ? "-" : $"{weight:N0}"; + return $""; + } + 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##}"; + + + + + + + + + + @Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(0), pmt?.Prices?.ElementAtOrDefault(0))) + + + @for (int i = 1; i < bucketNum; i++) { + + @Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(i), pmt?.Prices?.ElementAtOrDefault(i))) + + } + last = part.SortId; + } + +
Lieferschein-Nr.Pos.SorteAttribut(e)GradationZu-/Abschläge@Raw(string.Join("
", Model.BucketNames))
Betrag
Abs.Rel.GewichtPreis
[°Oe][°KMW][@Model.CurrencySymbol/kg][%][kg][@Model.CurrencySymbol/kg][@Model.CurrencySymbol]
{w}{amount?.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)))}
@part.Delivery.LsNr@part.DPNr@part.Variant.Name@string.Join(" / ", part.PartAttributes.Select(a => a.AttrId))@($"{part.Oe:N0}")@($"{part.Kmw:N1}")@abs@rel@($"{pmt?.Amount:N2}")
+
diff --git a/Elwig/Documents/CreditNote.cshtml.cs b/Elwig/Documents/CreditNote.cshtml.cs new file mode 100644 index 0000000..57a6edd --- /dev/null +++ b/Elwig/Documents/CreditNote.cshtml.cs @@ -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 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("", "") + + $"Gutschrift" + + $"TG-Nr.{c.TgId}" + + $"Überw. am{c.Payment.Variant.TransferDate:dd.MM.yyyy}" + + $"Datum/Zeit{c.ModifiedTimestamp:dd.MM.yyyy} / {c.ModifiedTimestamp:HH:mm}" + + $""; + 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(); + } + }} diff --git a/Elwig/Documents/Document.cshtml.cs b/Elwig/Documents/Document.cshtml.cs index d222848..cd8f826 100644 --- a/Elwig/Documents/Document.cshtml.cs +++ b/Elwig/Documents/Document.cshtml.cs @@ -49,6 +49,8 @@ namespace Elwig.Documents { name = "BusinessLetter"; } else if (this is DeliveryNote) { name = "DeliveryNote"; + } else if (this is CreditNote) { + name = "CreditNote"; } else { throw new InvalidOperationException("Invalid document object"); } diff --git a/Elwig/Documents/Html.cs b/Elwig/Documents/Html.cs index c6ea6fe..cfb10d6 100644 --- a/Elwig/Documents/Html.cs +++ b/Elwig/Documents/Html.cs @@ -18,6 +18,7 @@ namespace Elwig.Documents { await e.CompileTemplateAsync("BusinessDocument"); await e.CompileTemplateAsync("BusinessLetter"); await e.CompileTemplateAsync("DeliveryNote"); + await e.CompileTemplateAsync("CreditNote"); Engine = e; evtHandler(); diff --git a/Elwig/Documents/style-creditnote.css b/Elwig/Documents/style-creditnote.css new file mode 100644 index 0000000..145e051 --- /dev/null +++ b/Elwig/Documents/style-creditnote.css @@ -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; +}