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;
}
}