Preserve full draft sections and disclose missing requested content

This commit is contained in:
2026-09-06 10:11:44 +03:00
parent a78aaef7e5
commit 996cc15245
5 changed files with 76 additions and 7 deletions
+30
View File
@@ -0,0 +1,30 @@
const normalize = value => value.normalize('NFC').replace(/\s+/g, ' ').trim();
/** Preserve useful draft text, while making missing requested sections explicit. */
export function qualifyOfferDraft(result, requested) {
if (!Array.isArray(result?.bolumler) || !result.bolumler.length)
throw new Error('Model bölüm üretmedi; tekrar deneyin.');
const byTitle = new Map();
for (const row of result.bolumler) {
if (typeof row?.baslik !== 'string' || typeof row?.icerik !== 'string' || !row.baslik.trim())
throw new Error('Model geçersiz bir taslak bölümü döndürdü. Yeniden deneyin.');
const key = normalize(row.baslik);
if (byTitle.has(key)) throw new Error('Model aynı taslak bölümünü birden fazla kez döndürdü. Yeniden deneyin.');
byTitle.set(key, {baslik:row.baslik.trim(), icerik:row.icerik.trim()});
}
const missingSections = [];
const bolumler = requested.map(baslik => {
const key = normalize(baslik), found = byTitle.get(key);
byTitle.delete(key);
if (found?.icerik) return {...found, baslik};
missingSections.push(baslik);
return {baslik, icerik:`[DOLDURUN: ${baslik} bölümü model tarafından tamamlanmadı. Kaynak belgelerle hazırlayın.]`};
});
// Keep unexpected useful content; it cannot substitute for a missing section.
const extraSections = [...byTitle.values()].filter(row => row.icerik);
return {bolumler:[...bolumler, ...extraSections], draftReview:{
status:missingSections.length || extraSections.length ? 'partial' : 'draft',
requestedSections:requested, missingSections, extraSections:extraSections.map(row=>row.baslik),
note:'Bu çıktı düzenlenebilir bir taslaktır. Bölümlerin bulunması, bilgilerin doğru veya resmi teklif dosyasının hazır olduğunu göstermez. Kaynak, firma bilgileri, fiyatlar ve zorunlu belgeler ayrıca kontrol edilmelidir.',
}};
}