align daily bulletin with Istanbul date

This commit is contained in:
2026-09-06 19:15:27 +03:00
parent 5a81be92ba
commit 07c9d67258
4 changed files with 22 additions and 8 deletions
@@ -24,6 +24,7 @@
"count": 3
}
],
"dailyBulletinHeading": true,
"analyticsTargetLabel": true,
"icsImported": true,
"icsStorageScoped": true,
+6
View File
@@ -2206,3 +2206,9 @@ Doğrulama: 293 otomatik test ve üretim derlemesi başarılı. Gece yarısı s
`npm run qa:live -- https://ihaleist.com` komutu eklendi. Probe yalnızca ana sayfa, `/api/health` ve `/api/ready` uç noktalarını GET ile kontrol ediyor; authentication, veri yazma, ödeme veya sağlayıcı çağrısı yapmıyor. Ana sayfa ve health için güvenlik başlıklarını da zorunlu tutup JSON kanıtı `qa-live-runtime.json` içine yazıyor.
6 Eylül 2026 çalıştırmasında ana sayfa ve health 200, readiness 404 döndü; üç güvenlik başlığı canlı yanıtlarda bulunmadı. Probe bu nedenle beklenen şekilde başarısız oldu. Bu sonuç yerel düzeltmelerin canlıya alınmadığını gösteren drift kanıtıdır.
### 2026-09-06 · Günlük bülten tarih ve erişilebilirlik düzeltmesi
Günlük bülten “bugün” hesabını tarayıcının yerel saatinden değil ortak İstanbul tarih anahtarından yapıyor. İhale başlığı artık klavye/ekran okuyucu için gerçek `button` olarak açılıyor; detay düğmesi de açık `type="button"` taşıyor.
Browser QA, dinamik sekme yüklemesi sonrası günlük bülten başlığını doğruluyor. 293 otomatik test ve üretim derlemesi başarılı.
+10 -8
View File
@@ -1,14 +1,15 @@
import React from 'react';
import { useApp } from '../../context/AppContext';
import { Newspaper, Calendar, Building2, Package, ArrowRight } from 'lucide-react';
import { istanbulDateKey } from '../../services/tenderCalendar';
export const DailyBulletin = () => {
const { tenders, setActiveTenderDetail } = useApp();
// Bugün: yayımlanma (ilan) tarihi bugün olanlar; ilan tarihi yoksa havuza az önce eklenenler.
const bugun = new Date();
const todayStr = `${String(bugun.getDate()).padStart(2, '0')}.${String(bugun.getMonth() + 1).padStart(2, '0')}.${bugun.getFullYear()}`;
const isoBugun = `${bugun.getFullYear()}-${String(bugun.getMonth() + 1).padStart(2, '0')}-${String(bugun.getDate()).padStart(2, '0')}`;
const isoBugun = istanbulDateKey();
const [bugunYil, bugunAy, bugunGun] = isoBugun.split('-');
const todayStr = `${bugunGun}.${bugunAy}.${bugunYil}`;
const bugunMu = (v) => !!v && (String(v).startsWith(isoBugun) || String(v).slice(0, 10) === todayStr);
const todayTenders = tenders.filter(t =>
bugunMu(t.ilanTarihi) || (!t.ilanTarihi && ((t.eklenmeZamani || '').includes('az') || (t.eklenmeZamani || '').includes('saat')))
@@ -42,11 +43,11 @@ export const DailyBulletin = () => {
<span className="text-[10px] font-extrabold bg-blue-100 text-blue-800 px-2 py-0.5 rounded">
#{t.ikn}
</span>
<h3
onClick={() => setActiveTenderDetail(t)}
className="font-bold text-base text-slate-900 hover:text-blue-600 cursor-pointer mt-1"
>
{t.baslik}
<h3>
<button type="button" aria-haspopup="dialog" onClick={() => setActiveTenderDetail(t)}
className="text-left font-bold text-base text-slate-900 hover:text-blue-600 cursor-pointer mt-1">
{t.baslik}
</button>
</h3>
</div>
<span className="text-xs font-bold text-slate-500 bg-slate-100 px-2.5 py-1 rounded-md">
@@ -72,6 +73,7 @@ export const DailyBulletin = () => {
</div>
<button
type="button"
onClick={() => setActiveTenderDetail(t)}
className="text-xs font-bold text-blue-600 hover:text-blue-800 flex items-center gap-1 hover:underline"
>
+5
View File
@@ -27,6 +27,11 @@ try {
await page.waitForLoadState('networkidle');
evidence.checks.visibleCities = await Promise.all(['Giresun', 'Kayseri', 'Akdeniz', 'Aksaray', 'Tepecik'].map(async city => ({ city, count: await page.getByText(city, { exact: false }).count() })));
if (evidence.checks.visibleCities.some(item => item.count < 1)) throw new Error('Beş sentetik şehirden biri görünmedi.');
await page.getByRole('button', { name: 'Günlük Bülten', exact: true }).click();
await page.getByRole('heading', { name: 'Günlük İhale Bülteni', exact: true }).waitFor({ state: 'attached', timeout: 10_000 });
evidence.checks.dailyBulletinHeading = await page.getByRole('heading', { name: 'Günlük İhale Bülteni', exact: true }).count() === 1;
if (!evidence.checks.dailyBulletinHeading) throw new Error('Günlük bülten başlığı açılmadı.');
await page.getByRole('button', { name: 'Ana İhale Listesi', exact: true }).click();
await page.getByRole('button', { name: 'Pazar', exact: true }).click();
await page.getByRole('button', { name: 'Analitik Dashboard', exact: true }).click();
await page.getByLabel('Ciro hedefi (TL)', { exact: true }).waitFor({ state: 'attached', timeout: 10_000 });