fix(part-prices): OEM ana kartında yalnız orijinal (OE) fiyatları göster
Some checks failed
QA Gate (P0/P1) / Test affected app (pull_request) Has been cancelled

OEM detay ana fiyat kartı seriyi markasız istiyordu; allowBrandless uzun
kodlarda orijinal + yan sanayi tekliflerini tek havuzda medyanlıyordu →
hiçbir satıcının fiyatı olmayan "hayalet medyan" ve marka stok girip-
çıkmasından fiyat değişmeden sahte grafik sıçraması (2026-07-14 ölçümü:
9827622780 pg p50 4.495₺ = PSA 5.531 ile OPAR 3.459'un ortası).

- filterOffersForBrand: markasız istek artık yalnız orijinal (OE/dağıtıcı
  etiketli) teklifleri kullanır; araç-markalı OE çapraz-ref çipleri de
  OE-only'ye iner, yan sanayi markasına orijinal fallback'i kaldırıldı.
- Orijinal sınıflaması otoritesi = kokpit marka tur='orjinal' seti (39
  marka, statik; PSA/MAIS/OPAR/ORJINAL... — FORD/GM/BMW/Mercedes/VW kokpit'te
  yansanayi, bilinçli dışarıda). Runtime kokpit bağımlılığı yok.
- Web: kart başlığı "Orijinal (OE) fiyat analizi" + açıklama/dipnot orijinal
  bilgisini yazıyor; ana OEM kodunun ölü markasız batch push'u kaldırıldı.
- Redis cache v2→v3 (anahtar üreticileri export'lanıp worker ile paylaşıldı);
  migration 0032 eski karma-havuz part_price satırlarını siler → OE-only
  kurallarla lazy re-backfill.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 13:28:27 +03:00
parent 32655ead7b
commit d0caf57e89
8 changed files with 251 additions and 26 deletions

View File

@@ -133,9 +133,13 @@ export function PartPriceSection({
<div className="flex flex-wrap items-start justify-between gap-3">
{variant === "card" ? (
<div>
<h2 className="text-sm font-semibold">Tedarikçi fiyat analizi</h2>
<h2 className="text-sm font-semibold">
{brand ? "Tedarikçi fiyat analizi" : "Orijinal (OE) fiyat analizi"}
</h2>
<p className="mt-0.5 text-xs text-muted-foreground">
Stoktaki tekliflerin dağılımı P50 medyan · P95 · P99
{brand
? "Stoktaki tekliflerin dağılımı — P50 medyan · P95 · P99"
: "Stoktaki orijinal/dağıtıcı tekliflerin dağılımı — P50 medyan · P95 · P99"}
</p>
</div>
) : (
@@ -211,8 +215,10 @@ export function PartPriceSection({
</div>
<p className="mt-2 text-[11px] leading-relaxed text-muted-foreground">
Fiyatlar stoktaki tedarikçi tekliflerinin istatistiksel dağılımıdır; tedarikçi bilgisi
paylaşılmaz. Son fiyat değişimi: {formatDateLong(data.series[data.series.length - 1].date)}
{brand
? "Fiyatlar stoktaki tedarikçi tekliflerinin istatistiksel dağılımıdır; tedarikçi bilgisi paylaşılmaz."
: "Fiyatlar yalnızca orijinal (OE/dağıtıcı) tekliflerin dağılımıdır — yan sanayi teklifleri dahil edilmez; tedarikçi bilgisi paylaşılmaz."}{" "}
Son fiyat değişimi: {formatDateLong(data.series[data.series.length - 1].date)}
</p>
</section>
);