diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index c7886ed..e68b496 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1350,6 +1350,11 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - Fiyat analizi grafiği min/medyan/ortalama/maksimum değerlerini tam iki ondalık istatistikten çiziyor; CSV ve grafik aynı tutarı kullanıyor. Görsel kartların mevcut Türkçe biçimlendirmesi korunuyor. - 283 test ve build başarılı. Grafik ve CSV’nin gerçek pazar ekranında birlikte kabulü henüz yapılmadı; genel plan açık. +### 2026-09-06 — Fiyat analizinde kuruş gösterimi + +- Fiyat grafiğinin kart, tooltip ve kapsam açıklaması artık iki ondalık basamak gösteriyor. Önceki genel `formatTL` biçimi sıfır ondalık kullandığı için hassas grafik değerleri ekranda yuvarlanıyordu. +- Seçilen birim açıklaması da kapsam metnine eklendi; kategori tutarının hangi birime ait olduğu görünür. 283 test ve build başarılı. Gerçek pazar ekranı kabulü hâlâ yapılmadı; genel plan açık. + ### 2026-09-06 — Fiyat analizi CSV kuruş koruması - Fiyat analizi CSV dışa aktarımında min/medyan/ortalama/maksimum değerleri artık yuvarlanıp kuruş kaybetmiyor; iki ondalık basamakla aynı ham istatistikleri taşıyor. diff --git a/src/components/tools/PriceAnalysis.jsx b/src/components/tools/PriceAnalysis.jsx index e4db96d..5a0e7eb 100644 --- a/src/components/tools/PriceAnalysis.jsx +++ b/src/components/tools/PriceAnalysis.jsx @@ -2,9 +2,11 @@ import React, { useState, useMemo, useEffect } 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 { itemStats } from '../../services/analytics'; import confetti from 'canvas-confetti'; +const formatPrice = (n) => n == null || !Number.isFinite(Number(n)) ? '—' : Number(n).toLocaleString('tr-TR', {minimumFractionDigits:2, maximumFractionDigits:2}) + ' ₺'; + export const PriceAnalysis = () => { const { tenders } = useApp(); const { items, itemCount, uniqueItems } = useMemo(() => itemStats(tenders), [tenders]); @@ -102,7 +104,7 @@ export const PriceAnalysis = () => { }`} >
📦 {it.ad}
-
{it.count} kayıt · {it.birim} medyan {formatTL(it.median)}
+
{it.count} kayıt · {it.birim} medyan {formatPrice(it.median)}
))} @@ -119,7 +121,7 @@ export const PriceAnalysis = () => { - formatTL(v)} /> + formatPrice(v)} /> {chartData.map((d, i) => )} @@ -130,7 +132,7 @@ export const PriceAnalysis = () => { {chartData.map((d) => (
{d.label}
-
{formatTL(d.value)}
+
{formatPrice(d.value)}
))} @@ -141,7 +143,7 @@ export const PriceAnalysis = () => { Karşılaştırmanın kapsamı

- {selected?.ad} grubunda {selected?.count} kaydın medyan kategori tutarı {formatTL(selected?.median)}. + {selected?.ad} grubunda {selected?.count} kaydın {selected?.birim} birimindeki medyan kategori tutarı {formatPrice(selected?.median)}. Bunlar ürün birim fiyatı değildir. Test adedi, ambalaj birimi, cihaz ve hizmet kapsamı doğrulanmadan bu tutarlardan teklif fiyatı veya kazanma olasılığı çıkarılamaz.