34 lines
2.3 KiB
JavaScript
34 lines
2.3 KiB
JavaScript
const normalize = text => String(text ?? '').normalize('NFC').replace(/\s+/g, ' ').trim();
|
||
const optionalText = value => typeof value === 'string' && value.trim() ? value.trim() : null;
|
||
|
||
/** A model cannot certify a row without identifying it and quoting the actual draft. */
|
||
export function qualifyOfferAudit(result, requirements, draft) {
|
||
if (!result || !Array.isArray(result.maddeler) || !result.maddeler.length)
|
||
throw new Error('Model denetim maddelerini döndürmedi. Yeniden deneyin.');
|
||
const source = normalize(draft);
|
||
const maddeler = requirements.map(gereklilik => {
|
||
const matches = result.maddeler.filter(row => row && typeof row.gereklilik === 'string' && normalize(row.gereklilik) === normalize(gereklilik));
|
||
const row = matches.length === 1 ? matches[0] : null;
|
||
let durum = ['karsilaniyor','eksik','belirsiz'].includes(row?.durum) ? row.durum : 'belirsiz';
|
||
let kanit = optionalText(row?.kanit);
|
||
let oneri = optionalText(row?.oneri);
|
||
if (!row) oneri = 'Model yanıtı bu gereklilikle tekil olarak eşleştirilemedi. Kaynak ve taslağı karşılaştırın.';
|
||
if (durum === 'karsilaniyor' && (!kanit || !source.includes(normalize(kanit)))) {
|
||
durum = 'belirsiz';
|
||
oneri = 'Karşılandığı iddiası taslaktaki gerçek bir alıntıyla doğrulanamadı. Elle kontrol edin.';
|
||
}
|
||
// Never display invented text as a quote from the user's draft.
|
||
if (kanit && !source.includes(normalize(kanit))) kanit = null;
|
||
return {gereklilik, durum, kanit, oneri};
|
||
});
|
||
const verified = maddeler.filter(row => row.durum === 'karsilaniyor').length;
|
||
const uncertain = maddeler.filter(row => row.durum === 'belirsiz').length;
|
||
return {
|
||
ozet: `${maddeler.length} gereklilikten ${verified} tanesi taslak alıntısıyla destekleniyor; ${uncertain} tanesi elle kontrol gerektiriyor.`, maddeler,
|
||
uyum_yuzde: maddeler.length ? Math.round(verified / maddeler.length * 100) : 0,
|
||
eksikler: maddeler.filter(row => row.durum === 'eksik').map(row => row.gereklilik),
|
||
belirsizSayisi: uncertain,
|
||
kapsam: 'Yalnız bu listede gösterilen gereklilikler kontrol edildi. Oran resmi başvuru uygunluğu veya tüm dokümanın eksiksiz denetlendiği anlamına gelmez. Alıntının taslakta bulunması şartın doğru karşılandığını tek başına kanıtlamaz.',
|
||
};
|
||
}
|