CV date format MM/YYYY instead of MM.YYYY

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-03 13:22:50 +02:00
co-authored by Claude
parent 798abf67d5
commit 2a12ab54d0
+17 -9
View File
@@ -158,13 +158,13 @@ async function generateTailoredTexts({ job, basisDokumente, settings, llmNotizen
` "lebenslauf": {\n` + ` "lebenslauf": {\n` +
` "profil": "23 Sätze Kurzprofil, zugeschnitten auf die Zielstelle",\n` + ` "profil": "23 Sätze Kurzprofil, zugeschnitten auf die Zielstelle",\n` +
` "berufserfahrung": [\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` + ` ],\n` +
` "studium": [\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` + ` ],\n` +
` "berufsausbildung": [\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` + ` ],\n` +
` "weiterbildungen": [],\n` + ` "weiterbildungen": [],\n` +
` "kenntnisse": ["Fähigkeit 1", "Fähigkeit 2"],\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", ` + `- 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 ` + `"arbeitslos", "arbeitssuchend", "gekündigt" o. Ä. Lasse "zusatz" in solchen Fällen leer und nenne nur ` +
`Zeitraum, Bezeichnung und Institution neutral.\n` + `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 ` + `Leere Felder als leerer String bzw. leeres Array. Antworte AUSSCHLIESSLICH mit dem ` +
`JSON-Objekt, ohne Markdown, ohne Code-Fences, ohne weiteren Text.`; `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]; for (const k of keys) if (Array.isArray(obj[k]) && obj[k].length) return obj[k];
return []; 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) { function toZeitraum(v) {
if (!v) return ''; if (!v) return '';
if (typeof v === 'string') return v.trim(); let out;
if (typeof v === 'object') { if (typeof v === 'string') out = v.trim();
else if (typeof v === 'object') {
const von = str(pick(v, ['von', 'from', 'start', 'beginn'])); const von = str(pick(v, ['von', 'from', 'start', 'beginn']));
const bis = str(pick(v, ['bis', 'to', 'ende', 'end'])); const bis = str(pick(v, ['bis', 'to', 'ende', 'end']));
return [von, bis].filter(Boolean).join(' '); out = [von, bis].filter(Boolean).join(' ');
} } else out = str(v);
return str(v); return normalizeDate(out);
} }
// After an Anrede ending in a comma, the body continues the sentence, so its // After an Anrede ending in a comma, the body continues the sentence, so its