diff --git a/CLAUDE.md b/CLAUDE.md index 8ac787b..5e98ef1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -123,7 +123,7 @@ Ein Arbeitspaket ist erst fertig, wenn die betroffenen öffentlichen Klassen und - Bei Namenskollisionen: `YYYY-MM-DD - Titel(1).pdf`, `YYYY-MM-DD - Titel(2).pdf`, ... - Die **konfigurierte maximale Titellänge** gilt nur für den **Basistitel**; das Dubletten-Suffix zählt nicht mit - Das Dubletten-Suffix wird unmittelbar vor `.pdf` angehängt -- Titel sind **deutsch**, verständlich, eindeutig und enthalten keine Sonderzeichen außer Leerzeichen +- Titel sind **deutsch**, verständlich, eindeutig und enthalten keine Sonderzeichen außer Leerzeichen und Bindestrichen - Eigennamen bleiben unverändert - Datumsermittlung mit Priorität aus den fachlichen Anforderungen; wenn kein belastbares Datum eindeutig ableitbar ist, ist das **aktuelle Datum** als Fallback erlaubt - Mehrdeutige Dokumente liefern **kein** unsicheres Ergebnis, sondern einen Fehler diff --git a/docs/specs/fachliche-anforderungen.md b/docs/specs/fachliche-anforderungen.md index beba1d5..eae44aa 100644 --- a/docs/specs/fachliche-anforderungen.md +++ b/docs/specs/fachliche-anforderungen.md @@ -68,7 +68,7 @@ Fallback auf aktuelles Datum ist erlaubt, wenn kein belastbares Datum eindeutig - maximal **konfigurierbare Anzahl Zeichen (Basistitel, Default 60, gültiger Bereich 10..120)** - verständlich und eindeutig -- keine Sonderzeichen außer Leerzeichen +- keine Sonderzeichen außer Leerzeichen und Bindestrichen --- 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 574f2d6..3d6b91b 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 @@ -102,7 +102,7 @@ public final class AiResponseValidator { if (!isAllowedTitleCharacters(title)) { return AiValidationResult.invalid( - "Title contains disallowed characters (only letters, digits, and spaces are permitted): '" + "Title contains disallowed characters (only letters, digits, spaces, and hyphens are permitted): '" + title + "'", AiErrorClassification.FUNCTIONAL); } @@ -142,14 +142,14 @@ public final class AiResponseValidator { // ------------------------------------------------------------------------- /** - * Returns {@code true} if every character in the title is a letter, digit, or space. + * Returns {@code true} if every character in the title is a letter, digit, space, or hyphen. *

* Permits Unicode letters including German Umlauts (ä, ö, ü, Ä, Ö, Ü) and ß. */ private static boolean isAllowedTitleCharacters(String title) { for (int i = 0; i < title.length(); i++) { char c = title.charAt(i); - if (!Character.isLetter(c) && !Character.isDigit(c) && c != ' ') { + if (!Character.isLetter(c) && !Character.isDigit(c) && c != ' ' && c != '-') { return false; } } 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 ddbbc82..3019465 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 @@ -139,12 +139,12 @@ class AiResponseValidatorTest { } @Test - void validate_titleWithHyphen_returnsInvalid() { + void validate_titleWithHyphen_isAccepted() { ParsedAiResponse parsed = ParsedAiResponse.of("Strom-Rechnung", "reasoning", null); AiResponseValidator.AiValidationResult result = validator.validate(parsed); - assertThat(result).isInstanceOf(AiResponseValidator.AiValidationResult.Invalid.class); + assertThat(result).isInstanceOf(AiResponseValidator.AiValidationResult.Valid.class); } @Test