Documents: Add DeliveryConfirmation
This commit is contained in:
100
Elwig/Documents/DeliveryConfirmation.cshtml
Normal file
100
Elwig/Documents/DeliveryConfirmation.cshtml
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
@using RazorLight
|
||||||
|
@inherits TemplatePage<Elwig.Documents.DeliveryConfirmation>
|
||||||
|
@model Elwig.Documents.DeliveryConfirmation
|
||||||
|
@{ Layout = "BusinessDocument"; }
|
||||||
|
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-deliveryconfirmation.css"/>
|
||||||
|
<main>
|
||||||
|
<h1>@Model.Title</h1>
|
||||||
|
<table class="delivery-confirmation">
|
||||||
|
<colgroup>
|
||||||
|
<col style="width: 25mm;"/>
|
||||||
|
<col style="width: 5mm;"/>
|
||||||
|
<col style="width: 20mm;"/>
|
||||||
|
<col style="width: 21mm;"/>
|
||||||
|
<col style="width: 19mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 15mm;"/>
|
||||||
|
<col style="width: 12mm;"/>
|
||||||
|
<col style="width: 14mm;"/>
|
||||||
|
<col style="width: 14mm;"/>
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th rowspan="2" style="text-align: left;">Lieferschein-Nr.</th>
|
||||||
|
<th rowspan="2">Pos.</th>
|
||||||
|
<th rowspan="2" style="text-align: left;">Sorte</th>
|
||||||
|
<th rowspan="2" style="text-align: left;">Attribut(e)</th>
|
||||||
|
<th rowspan="2" style="text-align: left;">Qualitätsstufe</th>
|
||||||
|
<th colspan="2">Gradation</th>
|
||||||
|
<th colspan="2">Flächenbindung</th>
|
||||||
|
<th>Gewicht</th>
|
||||||
|
<th>Davon<br/>abwerten</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>[°Oe]</th>
|
||||||
|
<th>[°KMW]</th>
|
||||||
|
<th colspan="2">[kg]</th>
|
||||||
|
<th>[kg]</th>
|
||||||
|
<th>[kg]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@{
|
||||||
|
var lastSortId = "";
|
||||||
|
}
|
||||||
|
@foreach (var p in Model.Deliveries) {
|
||||||
|
var bins = p.Bins.Select((b, n) => (b, n + 1)).Where(b => b.Item1 > 0).ToArray();
|
||||||
|
var rowsBins = bins.Length;
|
||||||
|
var mods = p.Modifiers.Select(m => m.Name).ToArray();
|
||||||
|
var rowsMod = mods.Length + 1;
|
||||||
|
var rows = Math.Max(rowsBins, rowsMod);
|
||||||
|
var first = true;
|
||||||
|
@for (int i = 0; i < rows; i++) {
|
||||||
|
<tr class="@(first ? "first" : "") @(p.SortId != lastSortId && lastSortId != "" ? "new": "") @(rows > i + 1 ? "trailing" : "")">
|
||||||
|
@if (first) {
|
||||||
|
<td rowspan="@rows">@p.Delivery.LsNr</td>
|
||||||
|
<td rowspan="@rows">@p.DPNr</td>
|
||||||
|
<td class="small">@p.Variant.Name</td>
|
||||||
|
<td class="small">@p.AttributesString</td>
|
||||||
|
<td class="small">@p.Quality.Name</td>
|
||||||
|
<td rowspan="@rows" class="grad">@($"{p.Oe:N0}")</td>
|
||||||
|
<td rowspan="@rows" class="grad">@($"{p.Kmw:N1}")</td>
|
||||||
|
}
|
||||||
|
@if (i > 0 && i <= mods.Length) {
|
||||||
|
<td colspan="3" class="mod">@(mods[i - 1])</td>
|
||||||
|
} else if (i > 0) {
|
||||||
|
<td colspan="3"></td>
|
||||||
|
}
|
||||||
|
@if (i < bins.Length) {
|
||||||
|
var (b, n) = bins[i];
|
||||||
|
string name = "";
|
||||||
|
switch (n) {
|
||||||
|
case 1: name = $"geb. {p.SortId}{string.Join("", p.Attributes.Order().Select(a => a.AttrId).Take(2))}"; break;
|
||||||
|
case 2: name = $"geb. {p.SortId}{p.Attributes.Select(a => a.AttrId).Order().FirstOrDefault()}"; break;
|
||||||
|
case 3: name = $"geb. {p.SortId}{p.Attributes.Select(a => a.AttrId).Order().Skip(1).FirstOrDefault()}"; break;
|
||||||
|
case 4: name = $"geb. {p.SortId}"; break;
|
||||||
|
case 5: name = "ungeb."; break;
|
||||||
|
}
|
||||||
|
<td class="geb">@name:</td>
|
||||||
|
<td class="weight">@($"{b:N0}")</td>
|
||||||
|
} else {
|
||||||
|
<td colspan="2"></td>
|
||||||
|
}
|
||||||
|
@if (first) {
|
||||||
|
<td rowspan="@rows" class="weight">@($"{p.Weight:N0}")</td>
|
||||||
|
<td rowspan="@rows" class="weight"></td>
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
</tr>
|
||||||
|
lastSortId = p.SortId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<tr class="sum">
|
||||||
|
<td colspan="8">Gesamt:</td>
|
||||||
|
<td colspan="2" style="text-align: right;">@($"{Model.Deliveries.Sum(p => p.Weight):N0}")</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</main>
|
26
Elwig/Documents/DeliveryConfirmation.cshtml.cs
Normal file
26
Elwig/Documents/DeliveryConfirmation.cshtml.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Elwig.Documents {
|
||||||
|
public class DeliveryConfirmation : BusinessDocument {
|
||||||
|
|
||||||
|
public int Year;
|
||||||
|
public IEnumerable<DeliveryPart> Deliveries;
|
||||||
|
|
||||||
|
public DeliveryConfirmation(AppDbContext ctx, int year, Member m) : base($"Anlieferungsbestätigung {year} – {m.Name}", m) {
|
||||||
|
Year = year;
|
||||||
|
DocumentId = $"Anl.-Best. {Year}/{m.MgNr}";
|
||||||
|
Deliveries = ctx.DeliveryParts.FromSqlRaw($"""
|
||||||
|
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) = ({Year}, {m.MgNr})
|
||||||
|
ORDER BY v.sortid, v.abgewertet ASC, LENGTH(v.attributes) DESC, COALESCE(v.attributes, '~'), v.kmw DESC, v.lsnr, v.dpnr
|
||||||
|
""")
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -100,6 +100,8 @@ namespace Elwig.Documents {
|
|||||||
name = "DeliveryJournal";
|
name = "DeliveryJournal";
|
||||||
} else if (this is Letterhead) {
|
} else if (this is Letterhead) {
|
||||||
name = "Letterhead";
|
name = "Letterhead";
|
||||||
|
} else if (this is DeliveryConfirmation) {
|
||||||
|
name = "DeliveryConfirmation";
|
||||||
} else {
|
} else {
|
||||||
throw new InvalidOperationException("Invalid document object");
|
throw new InvalidOperationException("Invalid document object");
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ namespace Elwig.Documents {
|
|||||||
await e.CompileTemplateAsync("CreditNote");
|
await e.CompileTemplateAsync("CreditNote");
|
||||||
await e.CompileTemplateAsync("DeliveryJournal");
|
await e.CompileTemplateAsync("DeliveryJournal");
|
||||||
await e.CompileTemplateAsync("Letterhead");
|
await e.CompileTemplateAsync("Letterhead");
|
||||||
|
await e.CompileTemplateAsync("DeliveryConfirmation");
|
||||||
|
|
||||||
Engine = e;
|
Engine = e;
|
||||||
evtHandler();
|
evtHandler();
|
||||||
|
66
Elwig/Documents/style-deliveryconfirmation.css
Normal file
66
Elwig/Documents/style-deliveryconfirmation.css
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
table.delivery-confirmation {
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation thead {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation thead th {
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation td {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation td[rowspan] {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation .weight {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation .grad {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation .geb {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation .mod {
|
||||||
|
font-size: 8pt;
|
||||||
|
padding-left: 5mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation .small {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation tr.new td {
|
||||||
|
border-top: 0.5pt solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation tr:not(.first) td {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation tr.trailing td {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation tr.sum {
|
||||||
|
border-top: 0.5pt solid black;
|
||||||
|
break-before: avoid;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delivery-confirmation tr.sum td {
|
||||||
|
padding-top: 1mm;
|
||||||
|
}
|
@ -115,10 +115,10 @@ namespace Elwig.Models {
|
|||||||
public string OriginString => Origin.OriginString + "\n" + (Kg?.Gl != null ? $" / {Kg.Gl.Name}" : "") + (Kg != null ? $" / {Kg.AtKg.Gem.Name} / KG {Kg.AtKg.Name}" : "") + (Rd != null ? $" / Ried {Rd.Name}" : "");
|
public string OriginString => Origin.OriginString + "\n" + (Kg?.Gl != null ? $" / {Kg.Gl.Name}" : "") + (Kg != null ? $" / {Kg.AtKg.Gem.Name} / KG {Kg.AtKg.Name}" : "") + (Rd != null ? $" / Ried {Rd.Name}" : "");
|
||||||
|
|
||||||
[InverseProperty("Part")]
|
[InverseProperty("Part")]
|
||||||
public virtual DeliveryPartBin Bin { get; private set; }
|
public virtual DeliveryPartBin? Bin { get; private set; }
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public int[] Bins => (new int?[] { Bin.Bin1, Bin.Bin2, Bin.Bin3, Bin.Bin4, Bin.Bin5, Bin.Bin6, Bin.Bin7, Bin.Bin8, Bin.Bin9 })
|
public int[] Bins => (new int?[] { Bin?.Bin1, Bin?.Bin2, Bin?.Bin3, Bin?.Bin4, Bin?.Bin5, Bin?.Bin6, Bin?.Bin7, Bin?.Bin8, Bin?.Bin9 })
|
||||||
.Where(b => b != null).Select(b => b.Value).ToArray();
|
.Where(b => b != null).Select(b => b.Value).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user