Introduced the `ResultFilePath` property in the `ZugferdInvoice` model to store the path of generated result PDFs. Added a new service, `PdfResultPackageService`, to create result PDFs by converting the original PDF to PDF/A-3b format and attaching a report file. Updated `Upload.cshtml` and `Upload.cshtml.cs` to handle and display the `ResultFilePath`. Created a migration to add the `ResultFilePath` column to the database. Updated `Program.cs` to register the new service and added configuration sections in `appsettings.json` for input and output directories. Enhanced error handling and logging for better traceability.
84 lines
2.9 KiB
C#
84 lines
2.9 KiB
C#
using DXApp.TemplateKitProject.Data;
|
|
using DXApp.TemplateKitProject.Models;
|
|
using DXApp.TemplateKitProject.Services;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
|
|
|
namespace DXApp.TemplateKitProject.Pages.Invoices;
|
|
|
|
public class UploadModel(
|
|
PdfAttachmentExtractorService extractor,
|
|
ZugferdImportService zugferdImportService,
|
|
PdfResultPackageService resultPackageService,
|
|
AppDbContext db,
|
|
ILogger<UploadModel> logger) : PageModel
|
|
{
|
|
[BindProperty]
|
|
public IFormFile? PdfFile { get; set; }
|
|
|
|
public PdfExtractionResult? Result { get; private set; }
|
|
public bool ExtractionDone { get; private set; }
|
|
public string? ErrorMessage { get; private set; }
|
|
public ZugferdInvoice? ImportedInvoice { get; private set; }
|
|
public string? ResultFilePath { get; private set; }
|
|
|
|
public void OnGet()
|
|
{ }
|
|
|
|
public async Task<IActionResult> OnPostAsync()
|
|
{
|
|
if (PdfFile is null || PdfFile.Length == 0)
|
|
{
|
|
ModelState.AddModelError(nameof(PdfFile), "Bitte eine PDF-Datei auswählen.");
|
|
return Page();
|
|
}
|
|
|
|
if (!PdfFile.FileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
ModelState.AddModelError(nameof(PdfFile), "Nur PDF-Dateien sind erlaubt.");
|
|
return Page();
|
|
}
|
|
|
|
ExtractionDone = true;
|
|
|
|
try
|
|
{
|
|
// Stream in MemoryStream puffern → kann zweimal gelesen werden
|
|
using var memStream = new MemoryStream();
|
|
await PdfFile.CopyToAsync(memStream);
|
|
var originalBytes = memStream.ToArray(); // ← neu: als byte[] merken
|
|
|
|
// 1. Anhänge extrahieren
|
|
memStream.Position = 0;
|
|
Result = extractor.ExtractAttachments(memStream, PdfFile.FileName);
|
|
|
|
// 2. Wenn ZUGFeRD-XML gefunden → parsen und in DB speichern
|
|
if (Result.HasZugferdXml)
|
|
{
|
|
memStream.Position = 0;
|
|
ImportedInvoice = await zugferdImportService.ImportAsync(memStream, "Upload");
|
|
|
|
// 3. Result-Package erstellen (nur wenn Import erfolgreich)
|
|
if (ImportedInvoice is not null)
|
|
{
|
|
ResultFilePath = await resultPackageService.CreateResultPackageAsync(
|
|
originalBytes, PdfFile.FileName, ImportedInvoice);
|
|
|
|
// ResultFilePath in DB aktualisieren
|
|
if (ResultFilePath is not null)
|
|
{
|
|
ImportedInvoice.ResultFilePath = ResultFilePath;
|
|
await db.SaveChangesAsync();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.LogError(ex, "Fehler beim Verarbeiten der Datei '{FileName}'.", PdfFile.FileName);
|
|
ErrorMessage = $"Fehler beim Verarbeiten der Datei: {ex.Message}";
|
|
}
|
|
|
|
return Page();
|
|
}
|
|
} |