Populate search detail summaries from EKAP announcement tables

This commit is contained in:
2026-09-06 10:06:23 +03:00
parent a136a74a1b
commit 132bd815c6
4 changed files with 25 additions and 4 deletions
+1 -1
View File
@@ -717,7 +717,7 @@ const server = http.createServer(async (req, res) => {
const ikn = url.searchParams.get('ikn');
if (!ikn) return json(res, 400, { success: false, error: 'ikn gerekli' });
const out = await ilanMetni(ikn);
return json(res, 200, { success: true, ...out });
return json(res, 200, { success: true, ...out, ...announcementFields(out.metin) });
} catch (e) {
return json(res, 502, { success: false, error: e.message });
}
+6 -3
View File
@@ -26,10 +26,13 @@ export function uniqueTenders(records) {
export function announcementFields(text) {
const content = String(text || '');
const result = {aciklama:content};
const deadline = /Tarih\s*ve\s*Saati\s*:\s*(\d{2}\.\d{2}\.\d{4})\s*[-–]?\s*(\d{2}:\d{2})/i.exec(content);
// EKAP table cells are separated by pipes in extracted text. Keep the
// original announcement intact; normalize separators only for field parsing.
const fields = content.replace(/\s*\|\s*/g, ' ');
const deadline = /Tarih\s*ve\s*Saati\s*:\s*(\d{2}\.\d{2}\.\d{4})\s*[-–]?\s*(\d{2}:\d{2})/i.exec(fields);
if (deadline) { result.tarih = deadline[1]; result.saat = deadline[2]; }
const place = /3\.3\.?\s*[^:]{0,120}:\s*([\s\S]*?)(?=3\.4\.?)/i.exec(content);
const duration = /3\.4\.?\s*[^:]{0,100}:\s*([\s\S]*?)(?=3\.5\.?|4\s*[-–])/i.exec(content);
const place = /3\.3\.?\s*[^:]{0,120}:\s*([\s\S]*?)(?=3\.4\.?)/i.exec(fields);
const duration = /3\.4\.?\s*[^:]{0,100}:\s*([\s\S]*?)(?=3\.5\.?|4\s*[-–])/i.exec(fields);
if (place) result.teslimYeri = place[1].trim();
if (duration) result.teslimatSuresi = duration[1].trim();
if (/hizmet alımı\s+4734/i.test(content)) result.alimTuru = 'Kiralama ve Hizmet Alımı';