diff --git a/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidator.java b/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidator.java index 95c850b..3fae9f1 100644 --- a/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidator.java +++ b/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidator.java @@ -119,17 +119,23 @@ public final class AiResponseValidator { DateSource dateSource; if (parsed.dateString().isPresent()) { - String dateStr = parsed.dateString().get(); - try { - resolvedDate = LocalDate.parse(dateStr); - dateSource = DateSource.AI_PROVIDED; - } catch (DateTimeParseException e) { - return AiValidationResult.invalid( - "AI-provided date '" + dateStr + "' is not a valid YYYY-MM-DD date: " + e.getMessage(), - AiErrorClassification.FUNCTIONAL); + String dateStr = parsed.dateString().get().trim(); + // Leere Strings werden wie fehlende Daten behandelt – Fallback auf aktuelles Datum + if (dateStr.isEmpty()) { + resolvedDate = clockPort.now().atZone(java.time.ZoneOffset.UTC).toLocalDate(); + dateSource = DateSource.FALLBACK_CURRENT; + } else { + try { + resolvedDate = LocalDate.parse(dateStr); + dateSource = DateSource.AI_PROVIDED; + } catch (DateTimeParseException e) { + return AiValidationResult.invalid( + "AI-provided date '" + dateStr + "' is not a valid YYYY-MM-DD date: " + e.getMessage(), + AiErrorClassification.FUNCTIONAL); + } } } else { - // No date provided by the AI → fall back to current date from the clock + // Kein Datum von der KI bereitgestellt → Fallback auf aktuelles Datum resolvedDate = clockPort.now().atZone(java.time.ZoneOffset.UTC).toLocalDate(); dateSource = DateSource.FALLBACK_CURRENT; } diff --git a/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidatorTest.java b/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidatorTest.java index 3019465..7d1ae4a 100644 --- a/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidatorTest.java +++ b/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/service/AiResponseValidatorTest.java @@ -65,6 +65,18 @@ class AiResponseValidatorTest { assertThat(proposal.dateSource()).isEqualTo(DateSource.FALLBACK_CURRENT); } + @Test + void validate_aiProvidesEmptyDateString_usesFallbackCurrentDate() { + ParsedAiResponse parsed = ParsedAiResponse.of("Kontoauszug", "No date in document", ""); + + AiResponseValidator.AiValidationResult result = validator.validate(parsed); + + assertThat(result).isInstanceOf(AiResponseValidator.AiValidationResult.Valid.class); + NamingProposal proposal = ((AiResponseValidator.AiValidationResult.Valid) result).proposal(); + assertThat(proposal.resolvedDate()).isEqualTo(FIXED_DATE); + assertThat(proposal.dateSource()).isEqualTo(DateSource.FALLBACK_CURRENT); + } + @Test void validate_titleWithUmlauts_isAccepted() { ParsedAiResponse parsed = ParsedAiResponse.of("Mietvertrag Müller", "Rental contract", null);