/** * 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'));