- pg: part_price_tracks + part_price_daily (0018) — (kod, kaynak, gün) başına stoktaki tekliflerin p50/p95/p99 + teklif sayısı; source='supplier' şimdilik, perakende ileride aynı tabloya 'retail' olarak girer. Tedarikçi kimliği yok. - API: GET /part-prices/series (ilk istekte takip history'sinden lazy-backfill, sonrası salt-pg + Redis) ve POST /part-prices/current-batch (sayfadaki kodlar için canlı güncel istatistik). P-servisi sözleşmesi: asla throw yok, fail-open. - Worker: part-price-refresh cron'u 19:30 Europe/Istanbul (takip sync'i 19:05'te bitiyor) — izlenen kodlara bugünün satırını upsert eder, sku_map'i artımlı bakar, Redis cache düşürür. SUPPLIER_PRICE_DB_* yoksa sessiz no-op. - Kaynak köprüsü: takip.sku_map (code_norm → product_id; tam sku / ilk-boşluk / ilk-tire sonrası normalize adayları) vmi MySQL'inde kurulu; 6,8M satır. - Web: OEM detayında "Tedarikçi fiyat analizi" kartı (güncel medyan + P95/P99 + teklif sayısı + 30g delta, 30G/90G/Tümü aralıklı step grafik, recharts) ve article/muadil/OE satırlarında fiyat çipi → dialog'da tam geçmiş. - Fix(p): td snapshot'ında gerçek üretici kodu articles.name'de (article_number %96 upstream sayısal ID) — sayfa artık kopyalanabilir gerçek kodu gösteriyor. - compose: SUPPLIER_PRICE_DB_ENABLED/URL api+worker bloklarına eklendi. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
65 lines
1.8 KiB
JSON
65 lines
1.8 KiB
JSON
{
|
|
"name": "web",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite --port 3000",
|
|
"generate-routes": "tsr generate",
|
|
"build": "tsr generate && tsc -b && vite build",
|
|
"prerender": "node scripts/prerender.mjs",
|
|
"preview": "vite preview --port 3000",
|
|
"lint": "biome check src/",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run --passWithNoTests",
|
|
"test:watch": "vitest",
|
|
"clean": "rm -rf dist"
|
|
},
|
|
"dependencies": {
|
|
"@cardog-icons/react": "^1.1.1",
|
|
"@grafana/faro-web-sdk": "^2.2.4",
|
|
"@grafana/faro-web-tracing": "^2.2.4",
|
|
"@remotion/player": "^4.0.422",
|
|
"@sase/shared": "workspace:*",
|
|
"@sase/ui": "workspace:*",
|
|
"@sentry/react": "^9.0.0",
|
|
"@tanstack/react-query": "^5.62.0",
|
|
"@tanstack/react-router": "^1.120.0",
|
|
"better-auth": "^1.2.0",
|
|
"canvas-confetti": "^1.9.4",
|
|
"clsx": "^2.1.0",
|
|
"lucide-react": "^0.468.0",
|
|
"posthog-js": "^1.347.2",
|
|
"react": "^19.0.0",
|
|
"react-dom": "^19.0.0",
|
|
"react-markdown": "^9.1.0",
|
|
"recharts": "^3.8.1",
|
|
"remark-gfm": "^4.0.1",
|
|
"remotion": "^4.0.422",
|
|
"sileo": "^0.0.7",
|
|
"tailwind-merge": "^2.6.0",
|
|
"zod": "^3.24.0",
|
|
"zustand": "^5.0.0"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/postcss": "^4.0.0",
|
|
"@tailwindcss/vite": "^4.0.0",
|
|
"@tanstack/react-router-devtools": "^1.120.0",
|
|
"@tanstack/router-cli": "^1.159.4",
|
|
"@tanstack/router-plugin": "^1.120.0",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/canvas-confetti": "^1.9.0",
|
|
"@types/node": "^22.0.0",
|
|
"@types/react": "^19.0.0",
|
|
"@types/react-dom": "^19.0.0",
|
|
"@vitejs/plugin-react": "^4.5.0",
|
|
"jsdom": "^28.0.0",
|
|
"postcss": "^8.4.0",
|
|
"tailwindcss": "^4.0.0",
|
|
"typescript": "^5.7.0",
|
|
"vite": "^6.3.0",
|
|
"vitest": "^3.2.4"
|
|
}
|
|
}
|