Files
ihaleist/server/offer-audit.mjs
T

34 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.',
};
}