From 3fbaa1ca26f775ee109a6496e26f3543f5a9fb2c Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 19:12:39 +0300 Subject: [PATCH] use Istanbul dates for document alerts --- docs/quality/uygulama-durumu.md | 6 ++++++ src/context/AppContext.jsx | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 4f67a90..d5cc605 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -2194,3 +2194,9 @@ Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. İki gerçek hes Browser QA artık Pazar → Analitik Dashboard akışını açıp ciro hedefi alanının `Ciro hedefi (TL)` erişilebilir adına sahip olduğunu doğruluyor. Böylece yeni form sınırları yalnız kaynak kodda değil, dinamik sekme yüklemesi sonrasında da kontrol ediliyor. Doğrulama: browser QA başarılı; analitik erişilebilirlik kontrolü, ICS, çıktı ve 390px kontrolleri birlikte geçti. + +### 2026-09-06 · Belge uyarılarında İstanbul günü + +Belge son kullanma uyarısı artık “bugün” anahtarını UTC tarihinden değil İstanbul tarihinden üretiyor. Yalnız tarih içeren son kullanma değerleri `+03:00` gece yarısı olarak ayrıştırılıyor; böylece Türkiye’de gün değişimi sırasında 30 gün/son kullanma uyarısı bir gün kaymıyor. Geçersiz tarih sessizce yaklaşan belge olarak sayılmıyor. + +Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gece yarısı sınırı için gerçek saat kontrollü tarayıcı kabulü ayrıca yapılmalı. diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index 70bb65f..2434f9f 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -14,6 +14,7 @@ import { getUserDataSnapshot, setUserData, getPlan, bildirimleriGetir, bildirimO import { applyTenderStates, tenderStateKey, tenderSnapshot, publicTender, tenderSourceChanges } from '../services/tenderState'; import { getTenderStates, saveTenderState } from '../services/account'; import { SECTORS_LIST, INSTITUTION_TYPES_LIST } from '../data/constants'; +import { istanbulDateKey } from '../services/tenderCalendar'; const AppContext = createContext(); @@ -710,7 +711,7 @@ export const AppProvider = ({ children }) => { if (!veriSenkron) return; const session = getToken(); const uyariAnahtari = hesapAnahtari('ihaleist_belge_uyari_gunu', authUser?.email); - const bugun = new Date().toISOString().slice(0, 10); + const bugun = istanbulDateKey(); try { if (localStorage.getItem(uyariAnahtari) === bugun) return; } catch { /* yoksay */ } listDocuments().then((d) => { if(getToken() !== session) return; @@ -718,7 +719,12 @@ export const AppProvider = ({ children }) => { const dolan = [], yakin = []; for (const b of d?.belgeler || []) { if (!b.son_kullanma) continue; - const kalan = Math.ceil((new Date(b.son_kullanma).getTime() - simdi) / 86400000); + const rawDate = String(b.son_kullanma).trim(); + const sonKullanmaMs = /^\d{4}-\d{2}-\d{2}$/.test(rawDate) + ? Date.parse(`${rawDate}T00:00:00+03:00`) + : Date.parse(rawDate); + if (!Number.isFinite(sonKullanmaMs)) continue; + const kalan = Math.ceil((sonKullanmaMs - simdi) / 86400000); if (kalan < 0) dolan.push(b.ad); else if (kalan <= 30) yakin.push(`${b.ad} (${kalan} gün)`); } if (dolan.length) notify(`${dolan.length} belgenin süresi dolmuş`, dolan.slice(0, 4).join(', '));