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, ILogger 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 void OnGet() { } public async Task 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); // 1. Anhänge extrahieren und auf Disk speichern 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"); } } catch (Exception ex) { logger.LogError(ex, "Fehler beim Verarbeiten der Datei '{FileName}'.", PdfFile.FileName); ErrorMessage = $"Fehler beim Verarbeiten der Datei: {ex.Message}"; } return Page(); } }