fix: preserve bid drafts and align tender source data
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { documentContent } from './document-content.mjs';
|
||||
// Teklif asistanı — İhaleAB'den taşınan üç AI özelliği, ihaleist'in mevcut
|
||||
// analyzeSpec zinciri (yedekli sağlayıcılar) üzerinde:
|
||||
// 1) belgeyeSor: ihale dokümanı/ilan metninde soru → atıflı yanıt
|
||||
@@ -47,21 +48,22 @@ export function getir(parcalar, soru, k = 8) {
|
||||
}
|
||||
|
||||
/** İhalenin metni: verilen metin > EKAP dokümanı (tarayıcı varsa) > ilan metni. */
|
||||
export async function ihaleMetni(ikn, verilen) {
|
||||
export async function ihaleMetni(ikn, verilen, ilan) {
|
||||
if (verilen && String(verilen).trim().length > 200) return { text: String(verilen), kaynak: 'yüklenen' };
|
||||
if (ikn && (await browserAvailable().catch(() => false))) {
|
||||
try { const r = await documentText(ikn); if (r?.text && r.text.length > 200) return { text: r.text, kaynak: 'EKAP dokümanı' }; } catch { /* ilan metnine düş */ }
|
||||
try { const text = documentContent(await documentText(ikn)); if (text.length > 200) return { text, kaynak: 'EKAP dokümanı' }; } catch { /* ilan metnine düş */ }
|
||||
}
|
||||
if (ikn) {
|
||||
try { const r = await ilanMetni(ikn); const text = typeof r === 'string' ? r : r?.text; if (text && text.length > 100) return { text, kaynak: 'ilan metni' }; } catch { /* yok */ }
|
||||
try { const text = documentContent(await ilanMetni(ikn)); if (text && text.length > 100) return { text, kaynak: 'ilan metni' }; } catch { /* yok */ }
|
||||
}
|
||||
if (String(ilan || '').trim().length > 100) return {text:String(ilan),kaynak:'İhale ilanı (teknik şartname değil)'};
|
||||
return { text: '', kaynak: null };
|
||||
}
|
||||
|
||||
export async function belgeyeSor({ ikn, soru, text, tender, chain }) {
|
||||
const q = String(soru ?? '').trim().slice(0, 500);
|
||||
if (q.length < 3) throw new Error('Soru en az 3 karakter olmalı.');
|
||||
const { text: metin, kaynak } = await ihaleMetni(ikn, text);
|
||||
const { text: metin, kaynak } = await ihaleMetni(ikn, text, tender?.aciklama);
|
||||
if (!metin) throw new Error('Bu ihale için doküman metni bulunamadı — PDF\'i "Yapay Zeka Asistanı"ndan yükleyip tekrar sorun.');
|
||||
const parcalar = parcala(metin);
|
||||
const kaynaklar = getir(parcalar, q, 8);
|
||||
@@ -96,7 +98,7 @@ function gereklilikMetni(tender, gereklilikler, metin) {
|
||||
export async function teklifDenetle({ ikn, taslak, gereklilikler, tender, chain, text }) {
|
||||
const t = String(taslak ?? '').trim().slice(0, 60000);
|
||||
if (t.length < 200) throw new Error('Taslak en az 200 karakter olmalı.');
|
||||
const { text: metin } = await ihaleMetni(ikn, text).catch(() => ({ text: '' }));
|
||||
const { text: metin } = await ihaleMetni(ikn, text, tender?.aciklama).catch(() => ({ text: '' }));
|
||||
const liste = gereklilikMetni(tender, gereklilikler, metin);
|
||||
if (!liste.length) throw new Error('Gereklilik listesi yok — önce derin analiz çalıştırın veya dokümanı yükleyin.');
|
||||
const sistem = `Sen kamu ihalelerinde teklif dosyası denetçisisin. Gereklilik listesi ve teklif TASLAĞI verilecek. Her gereklilik için taslağı kontrol et. "karsilaniyor" yalnızca taslakta açık karşılığı varsa (alıntıyı 'kanit'e aynen kopyala); değinilmiyorsa "eksik"; kısmen/belirsizse "belirsiz". Sayı üretme. Yalnızca JSON: {"ozet":"2-3 cümle","maddeler":[{"gereklilik":"","durum":"karsilaniyor"|"eksik"|"belirsiz","kanit":"veya null","oneri":"veya null"}]} — maddeleri verilen sırada döndür.`;
|
||||
@@ -121,7 +123,7 @@ const BOLUMLER = {
|
||||
|
||||
export async function teklifTaslak({ ikn, tur, tender, firma, belgeler, fiyat, gereklilikler, chain, text }) {
|
||||
const istenen = BOLUMLER[tur] || BOLUMLER.tam;
|
||||
const { text: metin } = await ihaleMetni(ikn, text).catch(() => ({ text: '' }));
|
||||
const { text: metin } = await ihaleMetni(ikn, text, tender?.aciklama).catch(() => ({ text: '' }));
|
||||
const liste = gereklilikMetni(tender, gereklilikler, metin);
|
||||
const baglam = [
|
||||
`İHALE: ${tender?.baslik ?? '?'} · İdare: ${tender?.kurum ?? '?'} · İl: ${tender?.sehir ?? '?'} · Tarih: ${tender?.tarih ?? '?'} · Usul: ${tender?.usul ?? tender?.alimTuru ?? '?'}${tender?.yaklasikMaliyet ? ' · Yaklaşık maliyet: ' + tender.yaklasikMaliyet : ''}${ikn ? ' · İKN ' + ikn : ''}`,
|
||||
|
||||
Reference in New Issue
Block a user