diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 0bdad9d..74c86d5 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1309,6 +1309,11 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - Bilinen tarihlerin mevcut gün/ay sunumu korunuyor. Böylece liste kartı, takvim ve detaydaki doğrulama gerektiren kayıtlarla çelişmiyor. - 280 test ve build başarılı. Eksik tarih kartının gerçek tarayıcı kabulü henüz eklenmedi; genel plan açık. +### 2026-09-06 — İhale kartında imkânsız gün kontrolü + +- Karttaki tarih regex ile eşleşse bile gün/ay/yıl bileşenleri artık JavaScript takviminde ayrıca doğrulanıyor. 31 Şubat gibi imkânsız tarihlerin gün veya ay olarak gösterilmesi engellendi; doğrulama etiketi kullanılıyor. +- Bilinen ve geçerli tarihler aynı görünümü koruyor. 281 test ve build başarılı. Kart bileşeni için ayrı geçersiz tarih tarayıcı kabulü henüz eklenmedi; genel plan açık. + ### 2026-09-06 — Analitik geçersiz tarih kontrolü - Analitik `parseDateTR`, JavaScript tarih yuvarlamasıyla 31 Şubat gibi imkânsız günleri geçerli tarihe dönüştürmüyordu; artık gün/ay/yıl bileşenlerini doğrulayıp geçersiz girdide `null` döndürüyor. Geçersiz tarihler yanlış hafta sonu veya kısa süre riskine dönüşmüyor. diff --git a/src/components/TenderCard.jsx b/src/components/TenderCard.jsx index 924c5b9..dfd8e85 100644 --- a/src/components/TenderCard.jsx +++ b/src/components/TenderCard.jsx @@ -8,7 +8,11 @@ export const TenderCard = ({ tender }) => { const eslesenKalemler = (kalemEslesen && tender.ikn && kalemEslesen.get(tender.ikn)) || null; const isFavKurum = favoriteKurumlar?.includes((tender.kurum || '').trim()); - const dateMatch = /^(\d{2})\.(\d{2})\.(\d{4})(?:\s|$)/.exec(String(tender.tarih || '').trim()); + const parsedDateMatch = /^(\d{2})\.(\d{2})\.(\d{4})(?:\s|$)/.exec(String(tender.tarih || '').trim()); + const dateMatch = parsedDateMatch && (() => { + const date = new Date(Number(parsedDateMatch[3]), Number(parsedDateMatch[2]) - 1, Number(parsedDateMatch[1])); + return date.getFullYear() === Number(parsedDateMatch[3]) && date.getMonth() === Number(parsedDateMatch[2]) - 1 && date.getDate() === Number(parsedDateMatch[1]) ? parsedDateMatch : null; + })(); const day = dateMatch?.[1] || '—'; const monthYearFormatted = dateMatch ? `${dateMatch[2]}.${dateMatch[3]}` : 'Tarih doğrulanmalı';