import React, { useState, useMemo } from 'react'; import { ResponsiveContainer, BarChart, Bar, XAxis, YAxis, Tooltip, CartesianGrid, Cell } from 'recharts'; import { TrendingUp, Download, Sparkles, Inbox } from 'lucide-react'; import { useApp } from '../../context/AppContext'; import { itemStats, formatTL } from '../../services/analytics'; import confetti from 'canvas-confetti'; export const PriceAnalysis = () => { const { tenders } = useApp(); const { items, itemCount, uniqueItems } = useMemo(() => itemStats(tenders), [tenders]); const [selectedKey, setSelectedKey] = useState(null); const selected = useMemo(() => { if (!items.length) return null; const found = items.find((i) => i.ad === selectedKey); return found || items[0]; }, [items, selectedKey]); const chartData = selected ? [ { label: 'En Düşük', value: Math.round(selected.min), renk: '#2563eb' }, { label: 'Medyan', value: Math.round(selected.median), renk: '#059669' }, { label: 'Ortalama', value: Math.round(selected.avg), renk: '#f59e0b' }, { label: 'En Yüksek', value: Math.round(selected.max), renk: '#dc2626' }, ] : []; const handleDownloadReport = () => { if (!items.length) return; const headers = ['Kalem', 'Birim', 'Adet(kayıt)', 'Min', 'Medyan', 'Ortalama', 'Maks']; const rows = items.map((i) => [ `"${(i.ad || '').replace(/"/g, '""')}"`, i.birim || '', i.count, Math.round(i.min), Math.round(i.median), Math.round(i.avg), Math.round(i.max), ]); const csv = 'data:text/csv;charset=utf-8,' + [headers.join(','), ...rows.map((r) => r.join(','))].join('\n'); const link = document.createElement('a'); link.href = encodeURI(csv); link.download = `ihaleist_fiyat_analizi_${Date.now()}.csv`; document.body.appendChild(link); link.click(); link.remove(); confetti({ particleCount: 60 }); }; return (
EKAP sonuç ilanlarındaki OKAS ihtiyaç kalemleri ve sözleşme bedellerinden hesaplanır · {uniqueItems} farklı kalem kategorisi, {itemCount} kayıt.
Yöntem: Türkiye'de ihale teklif birim fiyatları kamuya açık değildir. Buradaki tutarlar, EKAP sonuç ilanındaki sözleşme bedelinin ihalenin OKAS ihtiyaç kalemlerine bölünmesiyle elde edilen kategori bazlı yaklaşık değerlerdir — kesin birim fiyat değildir. Aynı OKAS kategorisindeki ihaleler arasında karşılaştırma için kullanın.
{selected?.ad} için toplanan {selected?.count} gerçek kayda göre rekabetçi birim fiyat aralığınız{' '} {formatTL(selected?.min)} – {formatTL(selected?.median)} arasıdır. Medyanın altında teklif vermek kazanma olasılığını artırır; ortalamanın ({formatTL(selected?.avg)}) üstü riskli olabilir.