import React from 'react'; import { useApp } from '../../context/AppContext'; import { redFlags, marketConcentration, formatTL } from '../../services/analytics'; import { ShieldAlert, AlertTriangle, TrendingDown, Building2, Users, Info } from 'lucide-react'; const SEVIYE = { yuksek: { etiket: 'Yüksek', kutu: 'bg-red-50 border-red-200', rozet: 'bg-red-100 text-red-800', cizgi: 'bg-red-500' }, orta: { etiket: 'Orta', kutu: 'bg-amber-50 border-amber-200', rozet: 'bg-amber-100 text-amber-800', cizgi: 'bg-amber-500' }, dusuk: { etiket: 'Düşük', kutu: 'bg-slate-50 border-slate-200', rozet: 'bg-slate-100 text-slate-700', cizgi: 'bg-slate-400' }, }; const TUR_IKON = { 'Tek teklif': Users, 'Düşük kırım': TrendingDown, 'Tahmin üstü bedel': AlertTriangle, 'Aşırı düşük teklif': TrendingDown, 'Tedarikçi yoğunlaşması': Building2, }; export const RedFlags = () => { const { tenders, setActiveTenderDetail } = useApp(); const { flags, yuksek, orta, analiz } = redFlags(tenders); const { hhi, seviye } = marketConcentration(tenders); return (
{/* Header */}

Kırmızı Bayrak & Şeffaflık Analizi

Tek teklifli ihaleler, olağandışı kırım oranları ve tedarikçi yoğunlaşması otomatik tespit edilir.

{/* Özet kartlar */}
Yüksek Öncelik {yuksek}
Orta Öncelik {orta}
Analiz Edilen {analiz} sonuç verisi olan ihale
Pazar Yoğunlaşması {hhi != null ? hhi : '—'} {seviye || 'HHI için sonuç verisi gerekli'}
{/* Yöntem notu */}

Bu sinyaller kamuya açık ihale verisinden otomatik hesaplanır ve incelenmeye değer durumları işaret eder — tek başlarına usulsüzlük kanıtı değildir. Tek teklif ve kırım analizleri, ilgili alanların (teklif sayısı, yaklaşık maliyet, sözleşme bedeli) veride bulunduğu ihaleler için üretilir.

{/* Bayrak listesi */} {flags.length === 0 ? (

Henüz kırmızı bayrak tespit edilmedi

Analiz için sonuç verisi (kazanan firma, sözleşme bedeli, teklif sayısı) gerekir. Doğrudan temin sonuçları ve EKAP sonuç ilanları biriktikçe bu liste otomatik dolar.

) : (
{flags.map((f) => { const s = SEVIYE[f.seviye]; const Icon = TUR_IKON[f.tur] || AlertTriangle; return (
{s.etiket} {f.tur} {f.deger && {f.deger}}

{f.aciklama}

{f.tender ? ( ) : (

{f.kurum}

)}
); })}
)}
); };