Documents: Replace Razor templates with iText
All checks were successful
Test / Run tests (push) Successful in 2m24s
All checks were successful
Test / Run tests (push) Successful in 2m24s
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
using Elwig.Models.Dtos;
|
||||
using iText.Kernel.Pdf;
|
||||
using iText.Layout.Element;
|
||||
using iText.Layout.Properties;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Elwig.Documents {
|
||||
public class DeliveryDepreciationList : Document {
|
||||
@@ -7,16 +11,98 @@ namespace Elwig.Documents {
|
||||
public new static string Name => "Abwertungsliste";
|
||||
|
||||
public string Filter;
|
||||
public IEnumerable<DeliveryJournalRow> Deliveries;
|
||||
public List<DeliveryJournalRow> Deliveries;
|
||||
|
||||
public DeliveryDepreciationList(string filter, IEnumerable<DeliveryJournalRow> deliveries) :
|
||||
base($"{Name} {filter}") {
|
||||
Filter = filter;
|
||||
Deliveries = deliveries;
|
||||
Deliveries = [.. deliveries];
|
||||
}
|
||||
|
||||
public DeliveryDepreciationList(string filter, DeliveryJournalData data) :
|
||||
this(filter, data.Rows) {
|
||||
}
|
||||
|
||||
protected override void RenderBody(iText.Layout.Document doc, PdfDocument pdf) {
|
||||
base.RenderBody(doc, pdf);
|
||||
doc.Add(new KernedParagraph(Name, 24)
|
||||
.SetTextAlignment(TextAlignment.CENTER).SetFont(BF)
|
||||
.SetMarginsMM(0, 0, 2, 0));
|
||||
doc.Add(new KernedParagraph(Filter, 14)
|
||||
.SetTextAlignment(TextAlignment.CENTER).SetFont(BF)
|
||||
.SetMarginsMM(0, 0, 5, 0));
|
||||
doc.Add(NewJournalTable(Deliveries));
|
||||
}
|
||||
|
||||
protected Table NewJournalTable(List<DeliveryJournalRow> deliveries) {
|
||||
var tbl = new Table(ColsMM(25, 6, 20, 12, 38, 18, 12, 10, 10, 14), true)
|
||||
.SetWidth(UnitValue.CreatePercentValue(100)).SetFixedLayout()
|
||||
.SetBorderCollapse(BorderCollapsePropertyValue.COLLAPSE);
|
||||
|
||||
tbl.AddHeaderCell(NewTh("Lieferschein-Nr.", rowspan: 2, left: true))
|
||||
.AddHeaderCell(NewTh("Pos.", rowspan: 2).SetPaddingRight(0))
|
||||
.AddHeaderCell(NewTh("Datum", rowspan: 2))
|
||||
.AddHeaderCell(NewTh("Zeit", rowspan: 2))
|
||||
.AddHeaderCell(NewTh("Sorte", rowspan: 2, left: true))
|
||||
.AddHeaderCell(NewTh("Attr./Bewirt.", rowspan: 2, colspan: 2, left: true))
|
||||
.AddHeaderCell(NewTh("Gradation", colspan: 2))
|
||||
.AddHeaderCell(NewTh("Menge"))
|
||||
.AddHeaderCell(NewTh("[°Oe]"))
|
||||
.AddHeaderCell(NewTh("[°KMW]").SetPaddingLeft(0).SetPaddingRight(0))
|
||||
.AddHeaderCell(NewTh("[kg]"));
|
||||
|
||||
int? lastMember = null;
|
||||
foreach (var p in deliveries) {
|
||||
if (lastMember != p.MgNr) {
|
||||
var border = lastMember != null;
|
||||
var memberDeliveries = deliveries.Where(d => d.MgNr == p.MgNr).ToList();
|
||||
var memberKmw = Helpers.Utils.AggregateDeliveryPartsKmw(memberDeliveries);
|
||||
var memberOe = Helpers.Utils.KmwToOe(memberKmw);
|
||||
tbl.AddCell(NewTd($"{p.MgNr}, {p.AdministrativeName}", colspan: 5, borderTop: border)
|
||||
.SetFont(BI))
|
||||
.AddCell(NewTd("Teil-Lfrg.:", borderTop: border, bold: true))
|
||||
.AddCell(NewTd($"{memberDeliveries.Count:N0}", right: true, borderTop: border, bold: true))
|
||||
.AddCell(NewTd($"{memberOe:N0}", center: true, borderTop: border, bold: true))
|
||||
.AddCell(NewTd($"{memberKmw:N1}", center: true, borderTop: border, bold: true))
|
||||
.AddCell(NewTd($"{memberDeliveries.Sum(p => p.Weight):N0}", right: true, borderTop: border, bold: true));
|
||||
}
|
||||
|
||||
tbl.AddCell(NewTd(p.LsNr))
|
||||
.AddCell(NewTd($"{p.Pos:N0}", center: true).SetPaddingLeft(0).SetPaddingRight(0))
|
||||
.AddCell(NewTd($"{p.Date:dd.MM.yyyy}", center: true))
|
||||
.AddCell(NewTd($"{p.Time:HH:mm}", center: true).SetPadding(0))
|
||||
.AddCell(NewTd(p.Variety))
|
||||
.AddCell(NewTd($"{p.Attribute}{(p.Attribute != null && p.Cultivation != null ? " / " : "")}{p.Cultivation}", colspan: 2))
|
||||
.AddCell(NewTd($"{p.Oe:N0}", center: true))
|
||||
.AddCell(NewTd($"{p.Kmw:N1}", center: true).SetPaddingLeft(0).SetPaddingRight(0))
|
||||
.AddCell(NewTd($"{p.Weight:N0}", right: true));
|
||||
lastMember = p.MgNr;
|
||||
}
|
||||
|
||||
var branches = deliveries.Select(d => d.DeliveryBranch).Distinct().Order().ToArray();
|
||||
if (branches.Length > 1) {
|
||||
foreach (var b in branches) {
|
||||
var border = branches[0] == b;
|
||||
var branchDeliveries = deliveries.Where(d => d.DeliveryBranch == b).ToList();
|
||||
var branchKmw = Helpers.Utils.AggregateDeliveryPartsKmw(branchDeliveries);
|
||||
var branchOe = Helpers.Utils.KmwToOe(branchKmw);
|
||||
tbl.AddCell(NewTd($"{b}:", colspan: 2, bold: true, borderTop: border))
|
||||
.AddCell(NewTd($"(Teil-)Lieferungen: {branchDeliveries.DistinctBy(p => p.LsNr).Count():N0} ({branchDeliveries.Count:N0})", colspan: 5, bold: true, borderTop: border))
|
||||
.AddCell(NewTd($"{branchOe:N0}", center: true, bold: true, borderTop: border))
|
||||
.AddCell(NewTd($"{branchOe:N1}", center: true, bold: true, borderTop: border))
|
||||
.AddCell(NewTd($"{branchDeliveries.Sum(p => p.Weight):N0}", right: true, bold: true, borderTop: border));
|
||||
}
|
||||
}
|
||||
|
||||
var kmw = Helpers.Utils.AggregateDeliveryPartsKmw(deliveries);
|
||||
var oe = Helpers.Utils.KmwToOe(kmw);
|
||||
tbl.AddCell(NewTd("Gesamt:", colspan: 2, bold: true, borderTop: true))
|
||||
.AddCell(NewTd($"(Teil-)Lieferungen: {deliveries.DistinctBy(p => p.LsNr).Count():N0} ({deliveries.Count:N0})", colspan: 5, bold: true, borderTop: true))
|
||||
.AddCell(NewTd($"{oe:N0}", center: true, bold: true, borderTop: true))
|
||||
.AddCell(NewTd($"{kmw:N1}", center: true, bold: true, borderTop: true))
|
||||
.AddCell(NewTd($"{deliveries.Sum(p => p.Weight):N0}", right: true, bold: true, borderTop: true));
|
||||
|
||||
return tbl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user