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` +
` "profil": "23 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