[#30] Documents: Add WineQualityStatistics

This commit is contained in:
2024-03-28 12:27:48 +01:00
parent 57662534f3
commit 26a9902a13
7 changed files with 330 additions and 15 deletions

View File

@ -86,6 +86,8 @@ namespace Elwig.Documents {
name = "MemberDataSheet";
} else if (this is MemberList) {
name = "MemberList";
} else if (this is WineQualityStatistics) {
name = "WineQualityStatistics";
} else {
throw new InvalidOperationException("Invalid document object");
}

View File

@ -0,0 +1,26 @@
using Elwig.Models.Dtos;
using System.Collections.Generic;
namespace Elwig.Documents {
public class WineQualityStatistics : Document {
public new static string Name => "Qualitätsstatistik";
public readonly string[][] QualIds = [["WEI"], ["RSW", "LDW"], ["QUW"], ["KAB"]];
public readonly Dictionary<string, string> QualityLevels = new() {
["WEI"] = "Wein",
["RSW"] = "Rebsortenwein",
["LDW"] = "Landwein",
["QUW"] = "Qualitätswein",
["KAB"] = "Kabinett",
};
public string Filter;
public WineQualityStatisticsData Data;
public WineQualityStatistics(string filter, WineQualityStatisticsData data) : base($"{Name} {filter}") {
Filter = filter;
Data = data;
}
}
}

View File

@ -0,0 +1,74 @@
@using RazorLight
@inherits TemplatePage<Elwig.Documents.WineQualityStatistics>
@model Elwig.Documents.WineQualityStatistics
@{ Layout = "Document"; }
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\WineQualityStatistics.css"/>
<main>
<h1>Qualitätsstatistik</h1>
<h2>@Model.Filter</h2>
@foreach (var sec in Model.Data.Sections) {
<table>
<colgroup>
<col style="width: 25%;"/>
<col style="width: 25%;"/>
<col style="width: 25%;"/>
<col style="width: 25%;"/>
</colgroup>
<thead>
<tr>
<th colspan="4" class="header @(sec.Type == "R" ? "red" : sec.Type == "W" ? "green" : "")">
<h3>@sec.Name</h3>
</th>
</tr>
</thead>
<tbody>
<tr>
@foreach (var qualIds in Model.QualIds) {
<td class="container">
<div class="row">
<span class="units">[°Oe]</span>
<span class="units">[kg]</span>
</div>
@foreach (var qualId in qualIds) {
<h4>@(Model.QualityLevels.GetValueOrDefault(qualId, qualId))</h4>
@foreach (var (oe, weight) in sec.Data.GetValueOrDefault(qualId, Array.Empty<(int, int)>())) {
<div class="row">
<span class="oe">@oe</span>
<span class="weight">@($"{weight:N0}")</span>
</div>
}
}
</td>
}
</tr>
<tr>
@foreach (var qualIds in Model.QualIds) {
var quals = qualIds.Select(q => sec.Data.GetValueOrDefault(q, Array.Empty<(int, int)>()));
var weight = quals.Sum(q => q.Sum(kv => kv.Item2));
var oe = quals.Sum(q => q.Sum(kv => (double)kv.Item1 * kv.Item2)) / weight;
<td class="container bold">
<div class="row">
<span class="oe">@(weight == 0 ? "" : $"{oe:N0}")</span>
<span class="weight">@($"{weight:N0}")</span>
</div>
</td>
}
</tr>
</tbody>
<tfoot>
<tr>
@{
var totalWeight = sec.Data.Values.Sum(q => q.Sum(kv => kv.Weight));
var totalOe = sec.Data.Values.Sum(q => q.Sum(kv => (double)kv.Oe * kv.Weight)) / totalWeight;
}
<td colspan="4" class="container bold footer @(sec.Type == "R" ? "red" : sec.Type == "W" ? "green" : "")">
<div class="row" style="width: 24%; margin-left: 76%;">
<span class="oe">@(totalWeight == 0 ? "" : $"{totalOe:N0}")</span>
<span class="weight">@($"{totalWeight:N0}")</span>
</div>
</td>
</tr>
</tfoot>
</table>
}
</main>

View File

@ -0,0 +1,93 @@
h1 {
text-align: center;
font-size: 24pt;
margin-top: 10mm;
margin-bottom: 2mm;
}
h2 {
text-align: center;
font-size: 14pt;
margin-top: 2mm;
}
h3 {
font-weight: bold;
font-size: 14pt;
margin: 0;
text-align: left;
}
h4 {
font-weight: bold;
font-style: italic;
font-size: 12pt;
margin: 0;
text-align: center;
margin: 2mm 0 2mm 0;
}
.row:first-child { margin-top: 0.5mm; }
.row:last-child { margin-bottom: 0.5mm; }
.bold {
font-weight: bold;
}
table {
margin-top: 10mm;
break-inside: avoid;
}
table th,
table td {
border: 0.5pt solid black;
vertical-align: top !important;
}
table .header {
padding: 1mm 2mm;
}
table .header,
table .footer {
background-color: #E0E0E0;
}
table .header.red,
table .footer.red {
background-color: #FFC0C0;
}
table .header.green,
table .footer.green {
background-color: #C0FFC0;
}
.row {
display: flex;
width: 100%;
font-size: 10pt;
}
.row span {
flex: 10mm 1 1;
display: block;
padding: 0 2mm;
}
.row .units {
text-align: center;
font-size: 8pt;
font-style: italic;
padding: 1mm;
}
.oe {
text-align: center;
}
.weight {
text-align: right;
}