From 0435b46d13de98915bb46afa541537c92da65193 Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 19:06:44 +0300 Subject: [PATCH] normalize account scoped firm storage --- docs/quality/uygulama-durumu.md | 6 ++++++ src/components/BidPackageBuilder.jsx | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 035068d..608bb0a 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -2158,3 +2158,9 @@ Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesa AI fallback zinciri daha önce ortak `localStorage` anahtarında tutuluyordu. Ayar artık normalize edilmiş hesap e-postasına bağlı anahtarda saklanıyor; oturum değişiminde yeni hesabın zinciri yeniden yükleniyor ve önceki hesabın değeri yazılmıyor. Depolama erişimi olmayan ortamlarda varsayılan zincir kullanılıyor. Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı AI ayarı tarayıcı kabulü ve canlı sağlayıcı testi ayrıca yapılmalı. + +### 2026-09-06 · Firma bilgilerinin yerel hesap anahtarı + +Teklif dosyası hazırlama ekranındaki firma bilgileri artık ham e-posta yerine normalize edilip URL kodlanmış hesap anahtarında tutuluyor. Büyük/küçük harf farkı aynı hesabı farklı yerel kayda bölmüyor; özel karakterler anahtar yapısını bozamıyor. Eski ortak/normalize edilmemiş anahtarlardan otomatik veri alınmıyor. + +Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gerçek iki hesaplı tarayıcı kabulü ve canlı deployment ayrıca yapılmalı. diff --git a/src/components/BidPackageBuilder.jsx b/src/components/BidPackageBuilder.jsx index fb485d1..0e93c6f 100644 --- a/src/components/BidPackageBuilder.jsx +++ b/src/components/BidPackageBuilder.jsx @@ -34,6 +34,7 @@ import { const FIRMA_ANAHTAR = 'ihaleist_firma_bilgi'; +const firmaAnahtari = email => `${FIRMA_ANAHTAR}:${encodeURIComponent(String(email || '').trim().toLowerCase())}`; const bosFirma = () => Object.fromEntries(ALANLAR.map((a) => [a.k, ''])); @@ -70,7 +71,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu const [firma, setFirma] = useState(() => { let kayitli = {}; - try { kayitli = JSON.parse(localStorage.getItem(FIRMA_ANAHTAR + ':' + authUser?.email) || '{}'); } catch { /* yoksay */ } + try { kayitli = JSON.parse(localStorage.getItem(firmaAnahtari(authUser?.email)) || '{}'); } catch { /* yoksay */ } return { ...bosFirma(), firmaUnvan: userProfile?.company || '', @@ -81,7 +82,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu useEffect(() => { if (!authUser?.email || dirty) return; let kayitli = {}; - try { kayitli = JSON.parse(localStorage.getItem(FIRMA_ANAHTAR + ':' + authUser.email) || '{}'); } catch { /* bozuk yerel kayıt yoksayılır */ } + try { kayitli = JSON.parse(localStorage.getItem(firmaAnahtari(authUser.email)) || '{}'); } catch { /* bozuk yerel kayıt yoksayılır */ } setFirma((onceki) => ({ ...bosFirma(), firmaUnvan: userProfile?.company || '', @@ -118,7 +119,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender, initialFocu const alanYaz = (k, v) => { const yeni = { ...firma, [k]: v }; setFirma(yeni); - try { localStorage.setItem(FIRMA_ANAHTAR + ':' + authUser?.email, JSON.stringify(yeni)); } catch { /* kota */ } + try { localStorage.setItem(firmaAnahtari(authUser?.email), JSON.stringify(yeni)); } catch { /* kota */ } }; const satirlar = useMemo(