Open and retain tender details discovered outside the main pool

This commit is contained in:
2026-09-06 10:01:34 +03:00
parent 819a10c006
commit a136a74a1b
8 changed files with 66 additions and 6 deletions
+10
View File
@@ -0,0 +1,10 @@
/** Keep unknown fields unknown when promoting a document-search result to a detail. */
export function searchTender(result) {
const ikn=String(result.ikn || '').trim();
if(!/^\d{4}\/\d+$/.test(ikn)) throw new Error('Bu sonuç için geçerli EKAP İKN bilgisi yok.');
const match=String(result.ihaleTarihSaat || '').trim().match(/^(\d{2}\.\d{2}\.\d{4})(?:\s+(\d{2}:\d{2}))?/);
return {id:`ekap-${ikn}`,ikn,baslik:result.baslik || '',kurum:result.kurum || '',sehir:result.sehir || '',
tarih:match?.[1] || '',saat:match?.[2] || '',alimTuru:result.tur || '',usul:result.usul || '',
durum:result.durum || '',items:[],aciklama:'',kaynak:'EKAP ürün araması',
sourceDate:result.ihaleTarihSaat || '',discoveredFromSearch:true};
}
+8 -1
View File
@@ -20,10 +20,17 @@ export async function fetchTenderDetail(tenderId, {signal, timeoutMs = 30000} =
let timedOut = false;
const timer = setTimeout(()=>{timedOut=true;controller.abort();},timeoutMs);
try {
const res = await fetch(`/api/tenders/${encodeURIComponent(tenderId)}/detail`, {signal:controller.signal});
const searchResult=String(tenderId).startsWith('ekap-');
const url=searchResult ? `/api/documents/ilan?ikn=${encodeURIComponent(tenderId.slice(5))}` : `/api/tenders/${encodeURIComponent(tenderId)}/detail`;
const res = await fetch(url, {signal:controller.signal});
if (!res.ok) throw new Error(`Detay API hatası: HTTP ${res.status}`);
const data = await res.json();
if (!data.success) throw new Error(data.error || 'Detay alınamadı');
if (searchResult) {
if (data.ikn !== tenderId.slice(5)) throw new Error('Kaynak yanıtındaki İKN aranan ihaleyle uyuşmuyor.');
data.aciklama=data.metin;
data.sourceWarning=data.ilanSayisi ? null : 'EKAP ilan metni bulunamadı; yalnız temel ihale bilgileri alındı. Resmi dokümanı kontrol edin.';
}
if (typeof data.aciklama !== 'string' || !data.aciklama.trim())
throw new Error('Kaynak ilan metni alınamadı. Yeniden deneyin veya asıl ilanı kontrol edin.');
return data;