Files
DXApp/DXApp.TemplateKitProject/Pages/Invoices/Upload.cshtml
OlgunR 6a46bf4f4b Add ZUGFeRD Guideline-ID extraction and display
Enhanced `PdfExtractionResult` with a new `ZugferdGuidelineId` property to store the ZUGFeRD Guideline-ID extracted from XMP metadata. Updated `Upload.cshtml` to display this information in the UI if available.

Implemented ZUGFeRD Guideline-ID extraction in `PdfAttachmentExtractorService` using a new helper method `ExtractGuidelineId`, which parses XMP metadata for known prefixes. Added logging for extracted Guideline-IDs and improved error handling with a `try-catch` block for metadata processing.

Fixed `FileAttachments` handling in `PdfAttachmentExtractorService` by converting to `List<T>` for proper `Count` property usage.
2026-05-26 17:05:52 +02:00

101 lines
4.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@page
@model DXApp.TemplateKitProject.Pages.Invoices.UploadModel
@{
ViewData["Title"] = "PDF/A Upload";
}
<h2>PDF/A Rechnung hochladen</h2>
<form method="post" enctype="multipart/form-data">
<div class="mb-3">
<label asp-for="PdfFile" class="form-label">PDF/A-Datei auswählen</label>
<input asp-for="PdfFile" type="file" class="form-control" accept=".pdf" />
<span asp-validation-for="PdfFile" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Hochladen &amp; Analysieren</button>
</form>
@if (Model.ExtractionDone)
{
<hr />
<h4>Ergebnis</h4>
@if (!string.IsNullOrEmpty(Model.ErrorMessage))
{
<div class="alert alert-danger">@Model.ErrorMessage</div>
}
else if (Model.Result == null || !Model.Result.HasAttachments)
{
<div class="alert alert-warning">Keine Anhänge in der PDF gefunden.</div>
}
else
{
<div class="alert @(Model.Result.HasZugferdXml ? "alert-success" : "alert-warning")">
@if (Model.Result.HasZugferdXml)
{
<strong>✔ ZUGFeRD/Factur-X XML gefunden:</strong>
<span>@Model.Result.ZugferdXmlAttachment!.OriginalFileName</span>
}
else
{
<strong>⚠ Kein ZUGFeRD-XML gefunden.</strong>
}
</div>
@* PDF/A-Konformitätsstufe anzeigen *@
<div class="alert @(Model.Result.PdfAWarning ? "alert-warning" : "alert-info") mt-2">
<strong>PDF/A-Konformität:</strong> @Model.Result.PdfALevel
@if (!string.IsNullOrEmpty(Model.Result.ZugferdGuidelineId))
{
<br />
<strong>Guideline-ID:</strong>
<code>@Model.Result.ZugferdGuidelineId</code>
}
@if (Model.Result.PdfAWarning)
{
<span> ⚠️ ZUGFeRD-Rechnungen müssen PDF/A-3b sein.</span>
}
</div>
<table class="table table-sm table-bordered">
<thead class="table-light">
<tr>
<th>Dateiname</th>
<th>Größe</th>
<th>ZUGFeRD?</th>
<th>Gespeichert unter</th>
</tr>
</thead>
<tbody>
@foreach (var a in Model.Result.Attachments)
{
<tr class="@(a.IsZugferdXml ? "table-success" : "")">
<td>@a.OriginalFileName</td>
<td>@($"{a.FileSizeBytes:N0}") Bytes</td>
<td>@(a.IsZugferdXml ? "✔ Ja" : "Nein")</td>
<td><small class="text-muted">@a.SavedFilePath</small></td>
</tr>
}
</tbody>
</table>
}
@if (Model.ImportedInvoice is not null)
{
<hr />
<h4>📄 Geparste Rechnungsdaten</h4>
<table class="table table-sm table-bordered w-auto">
<tr><th>Rechnungsnummer</th><td>@Model.ImportedInvoice.InvoiceNumber</td></tr>
<tr><th>Rechnungsdatum</th><td>@Model.ImportedInvoice.InvoiceDate.ToString("dd.MM.yyyy")</td></tr>
<tr><th>Verkäufer</th><td>@Model.ImportedInvoice.SellerName</td></tr>
<tr><th>USt-ID Verkäufer</th><td>@Model.ImportedInvoice.SellerTaxId</td></tr>
<tr><th>Käufer</th><td>@Model.ImportedInvoice.BuyerName</td></tr>
<tr><th>Währung</th><td>@Model.ImportedInvoice.CurrencyCode</td></tr>
<tr><th>Steuerbetrag</th><td>@Model.ImportedInvoice.TaxAmount.ToString("N2")</td></tr>
<tr><th>Gesamtbetrag</th><td><strong>@Model.ImportedInvoice.TotalAmount.ToString("N2")</strong></td></tr>
<tr><th>IBAN</th><td>@Model.ImportedInvoice.Iban</td></tr>
<tr><th>Importiert am</th><td>@Model.ImportedInvoice.ImportedAt.ToString("dd.MM.yyyy HH:mm")</td></tr>
</table>
<div class="alert alert-success mt-2">✔ Rechnung wurde in der Datenbank gespeichert (ID: @Model.ImportedInvoice.Id)</div>
}
}