From 2a12ab54d0da55328a456144d41b790f7c973726 Mon Sep 17 00:00:00 2001 From: Thomas Hackner Date: Fri, 3 Jul 2026 13:22:50 +0200 Subject: [PATCH] CV date format MM/YYYY instead of MM.YYYY Co-Authored-By: Claude --- lib/documents.js | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/documents.js b/lib/documents.js index e9b27a6..dd63046 100644 --- a/lib/documents.js +++ b/lib/documents.js @@ -158,13 +158,13 @@ async function generateTailoredTexts({ job, basisDokumente, settings, llmNotizen ` "lebenslauf": {\n` + ` "profil": "2–3 Sätze Kurzprofil, zugeschnitten auf die Zielstelle",\n` + ` "berufserfahrung": [\n` + - ` { "zeitraum": "02.2025 – heute", "titel": "Jobtitel", "firma": "Arbeitgeber, Ort", "punkte": ["Aufgabe/Erfolg 1", "Aufgabe/Erfolg 2"] }\n` + + ` { "zeitraum": "02/2025 – heute", "titel": "Jobtitel", "firma": "Arbeitgeber, Ort", "punkte": ["Aufgabe/Erfolg 1", "Aufgabe/Erfolg 2"] }\n` + ` ],\n` + ` "studium": [\n` + - ` { "zeitraum": "10.2010 – 03.2017", "abschluss": "Studiengang", "institution": "Hochschule", "zusatz": "" }\n` + + ` { "zeitraum": "10/2010 – 03/2017", "abschluss": "Studiengang", "institution": "Hochschule", "zusatz": "" }\n` + ` ],\n` + ` "berufsausbildung": [\n` + - ` { "zeitraum": "08.2006 – 07.2009", "abschluss": "Ausbildungsberuf / Abschluss", "institution": "Betrieb/Berufskolleg", "zusatz": "" }\n` + + ` { "zeitraum": "08/2006 – 07/2009", "abschluss": "Ausbildungsberuf / Abschluss", "institution": "Betrieb/Berufskolleg", "zusatz": "" }\n` + ` ],\n` + ` "weiterbildungen": [],\n` + ` "kenntnisse": ["Fähigkeit 1", "Fähigkeit 2"],\n` + @@ -241,7 +241,7 @@ async function generateTailoredTexts({ job, basisDokumente, settings, llmNotizen `- Keine negativen/entwertenden Vermerke: NIEMALS "nicht beendet", "abgebrochen", "ohne Abschluss", ` + `"arbeitslos", "arbeitssuchend", "gekündigt" o. Ä. Lasse "zusatz" in solchen Fällen leer und nenne nur ` + `Zeitraum, Bezeichnung und Institution neutral.\n` + - `- Sachlich, positiv, konsistente Datumsformate (MM.JJJJ).\n\n` + + `- Sachlich, positiv, konsistente Datumsformate (MM/YYYY), z. B. "02/2025 – heute".\n\n` + `Leere Felder als leerer String bzw. leeres Array. Antworte AUSSCHLIESSLICH mit dem ` + `JSON-Objekt, ohne Markdown, ohne Code-Fences, ohne weiteren Text.`; @@ -313,15 +313,23 @@ function pickArray(obj, keys) { for (const k of keys) if (Array.isArray(obj[k]) && obj[k].length) return obj[k]; return []; } +// Render CV date ranges with a slash separator (MM/YYYY) regardless of how +// the model formatted them, so the timeline reads consistently. Only the +// month.year pattern is rewritten; year-only entries and "heute" stay as-is. +function normalizeDate(s) { + return String(s || '').replace(/\b(\d{1,2})\.(\d{4})\b/g, (_, m, y) => String(m).padStart(2, '0') + '/' + y); +} + function toZeitraum(v) { if (!v) return ''; - if (typeof v === 'string') return v.trim(); - if (typeof v === 'object') { + let out; + if (typeof v === 'string') out = v.trim(); + else if (typeof v === 'object') { const von = str(pick(v, ['von', 'from', 'start', 'beginn'])); const bis = str(pick(v, ['bis', 'to', 'ende', 'end'])); - return [von, bis].filter(Boolean).join(' – '); - } - return str(v); + out = [von, bis].filter(Boolean).join(' – '); + } else out = str(v); + return normalizeDate(out); } // After an Anrede ending in a comma, the body continues the sentence, so its