← Code-Übersicht

ExtractInvoiceDataUseCase.php

Pfad: src/Application/Rechnung/ExtractInvoiceDataUseCase.php

Ext: php

Größe: 1953 Bytes

Geändert: 2026-07-16T14:10:57+02:00

Frühere Version vom 2026-07-16T14:10:57+02:00 · zur aktuellen Fassung

<?php
declare(strict_types=1);

namespace Demo\Application\Rechnung;

use Demo\Domain\Rechnung\ClockPort;
use Demo\Domain\Rechnung\ExtractedInvoiceData;
use Demo\Domain\Rechnung\InvoiceErrorCode;
use Demo\Domain\Rechnung\InvoiceLoggerPort;
use Demo\Domain\Rechnung\InvoiceRecord;
use Demo\Domain\Rechnung\TextExtractionPort;

/**
 * Use Case: PDF-Textextraktion und Plausibilitaetscheck.
 */
final class ExtractInvoiceDataUseCase
{
    /**
     * @param TextExtractionPort $extractor Extraktionsadapter.
     * @param InvoiceLoggerPort  $logger    Logging.
     * @param ClockPort         $clock     Zeitquelle.
     */
    public function __construct(
        private TextExtractionPort $extractor,
        private InvoiceLoggerPort $logger,
        private ClockPort $clock
    ) {
    }

    /**
     * @param string       $runId  Lauf-ID.
     * @param InvoiceRecord $record Datensatz.
     * @return ExtractedInvoiceData Extrahierte Werte.
     */
    public function execute(string $runId, InvoiceRecord $record): ExtractedInvoiceData
    {
        if ($record->originalPfad === null || !is_file($record->originalPfad)) {
            throw new InvoiceProcessException(
                InvoiceErrorCode::EXTRACT,
                'extraction',
                'Original-PDF nicht gefunden'
            );
        }

        $this->logger->logStep($runId, 'extract', 'START', ['sourceId' => $record->quelleId]);
        $extracted = $this->extractor->extract($record->originalPfad);
        if (!$extracted->hasRequiredFields()) {
            throw new InvoiceProcessException(
                InvoiceErrorCode::EXTRACT,
                'extract',
                'Pflichtfelder konnten nicht gelesen werden'
            );
        }

        $this->logger->logStep($runId, 'extract', 'DONE', [
            'sourceId' => $record->quelleId,
            'confidence' => $extracted->extractionConfidence,
        ]);

        return $extracted;
    }
}