Files
ihaleist/server/siniflandir.mjs
T

70 lines
4.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.
/**
* Sektör ve kurum tipi sınıflandırması — TEK kaynak.
*
* Üç ayrı veri kaynağı (ilan.gov.tr canlı akışı, doğrudan temin, EKAP sonuç
* arşivi) aynı kurallardan geçer. Aksi halde "Sağlık" filtresi yalnızca bir
* kaynağı süzer, diğer iki kaynaktaki ihaleler görünmez olur.
*
* Sıra ÖNEMLİ: ilk eşleşen kazanır, bu yüzden dar/özel kalıplar geniş
* olanlardan önce gelir (ör. "tıbbi gaz" → Sağlık, "doğalgaz" → Enerji).
*/
export const SECTOR_RULES = [
[/tıbbi|medikal|sağlık|hastane|ilaç|cerrahi|laboratuvar|diş |protez|ortez|görüntüleme|röntgen|tomografi|steril|enjektör|eldiven|maske|reaktif|kit alım/i, 'Sağlık / Tıbbi Malzeme'],
[/yazılım|bilişim|sunucu|donanım|network|bilgisayar|lisans|veri merkezi|siber|yazıcı alım|tablet|projeksiyon/i, 'Bilişim & Yazılım'],
[/güvenlik hizmet|özel güvenlik|kamera|cctv|alarm|turnike|x-ray|güvenlik sistem/i, 'Güvenlik Sistemleri'],
[/gıda|yemek|catering|ekmek|et alım|sebze|meyve|kumanya|süt|tavuk|bakliyat|mutfak/i, 'Gıda & Catering'],
[/temizlik|hijyen|dezenfek|deterjan|çöp|atık toplama|haşere|ilaçlama/i, 'Temizlik & Hijyen'],
[/asfalt|beton|yol yapım|köprü|altyapı|kanalizasyon|içme suyu|sulama|menfez|istinat/i, 'Altyapı & Yol'],
[/inşaat|yapım işi|onarım|tadilat|güçlendirme|çatı|cephe|restorasyon|bakım onarım/i, 'İnşaat & Bakım'],
[/kırtasiye|matbaa|baskı|kağıt|toner|kartuş|fotokopi|büro malzeme/i, 'Kırtasiye & Büro'],
[/mobilya|masa|sandalye|dolap|okul sırası|büro mobilya|raf /i, 'Mobilya & Donatı'],
[/giyim|tekstil|elbise|üniforma|kıyafet|ayakkabı|çamaşır|kumaş|battaniye/i, 'Tekstil & Giyim'],
[/akaryakıt|motorin|benzin|lpg|yakıt alım/i, 'Akaryakıt & Yakıt'],
[/araç kirala|taşıt kirala|servis hizmet|personel taşıma|öğrenci taşıma|nakliye|lojistik/i, 'Taşımacılık & Kiralama'],
[/araç|otomotiv|lastik|yedek parça|otobüs|kamyon|iş makinesi|greyder|ekskavatör/i, 'Otomotiv & İş Makinesi'],
[/elektrik|trafo|enerji|aydınlatma|jeneratör|güneş|solar|kablo|pano |ups /i, 'Elektrik & Enerji'],
[/doğalgaz|kalorifer|kazan|ısıtma|soğutma|klima|havalandırma|iklimlendirme|mekanik tesisat/i, 'Isıtma & İklimlendirme'],
[/asansör|yürüyen merdiven/i, 'Asansör & Yürüyen Sistem'],
[/su arıtma|arıtma tesis|pompa|sondaj|kuyu |su deposu/i, 'Su & Arıtma'],
[/tarım|tohum|gübre|fide|zirai|hayvan|yem |veteriner|sera /i, 'Tarım & Hayvancılık'],
[/peyzaj|park bahçe|ağaç|çim |fidan|oyun grubu|kent mobilya/i, 'Peyzaj & Park'],
[/eğitim hizmet|kurs|seminer|danışmanlık|müşavirlik|etüt proje|mühendislik hizmet|kontrollük/i, 'Danışmanlık & Proje'],
[/reklam|tanıtım|organizasyon|fuar|basın|medya|prodüksiyon/i, 'Reklam & Organizasyon'],
[/sigorta|zorunlu trafik|kasko/i, 'Sigorta'],
[/kitap|yayın|kütüphane|arşiv|dijitalleştirme/i, 'Yayın & Arşiv'],
[/spor|halı saha|tribün|fitness|kondisyon/i, 'Spor Tesisleri'],
[/laboratuvar cihaz|analiz cihaz|ölçüm cihaz|test cihaz/i, 'Laboratuvar & Ölçüm'],
];
export const INSTITUTION_RULES = [
[/büyükşehir belediye/i, 'Büyükşehir Belediyeleri'],
[/belediye/i, 'Belediyeler'],
[/üniversite/i, 'Üniversiteler'],
[/hastane|sağlık müdürlüğü|başhekim/i, 'Eğitim ve Araştırma Hastaneleri'],
[/ağız ve diş/i, 'Ağız ve Diş Sağlığı Merkezleri'],
[/ceza infaz|cezaevi|tevkifevi/i, 'Ceza İnfaz Kurumları'],
[/bakanlığı|bakanlık|valiliği|müdürlüğü/i, 'Bakanlıklar'],
[/a\.ş\.|genel müdürlüğü|işletme/i, 'Kamu Şirketleri'],
];
export function classify(rules, text, fallback) {
for (const [re, label] of rules) if (re.test(text)) return label;
return fallback;
}
/** İhale metninden sektör. Kaynak ne olursa olsun aynı sonucu verir. */
export function sektorBul(...parcalar) {
return classify(SECTOR_RULES, parcalar.filter(Boolean).join(' '), 'Genel');
}
export function kurumTipiBul(ad) {
return classify(INSTITUTION_RULES, ad || '', 'Diğer Kamu Kurumları');
}
/** Arayüzün kullandığı listeler — kurallardan türetilir, elle tutulmaz. */
export const SEKTOR_ETIKETLERI = [...new Set(SECTOR_RULES.map(([, ad]) => ad))]
.sort((a, b) => a.localeCompare(b, 'tr'));
export const KURUM_ETIKETLERI = [...new Set(INSTITUTION_RULES.map(([, ad]) => ad))]
.sort((a, b) => a.localeCompare(b, 'tr'));