fix: validate calendar dates on tender cards

This commit is contained in:
2026-09-06 16:30:39 +03:00
parent 2d1667940a
commit 628635fea1
2 changed files with 10 additions and 1 deletions
+5
View File
@@ -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. - 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. - 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ü ### 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. - 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.
+5 -1
View File
@@ -8,7 +8,11 @@ export const TenderCard = ({ tender }) => {
const eslesenKalemler = (kalemEslesen && tender.ikn && kalemEslesen.get(tender.ikn)) || null; const eslesenKalemler = (kalemEslesen && tender.ikn && kalemEslesen.get(tender.ikn)) || null;
const isFavKurum = favoriteKurumlar?.includes((tender.kurum || '').trim()); 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 day = dateMatch?.[1] || '—';
const monthYearFormatted = dateMatch ? `${dateMatch[2]}.${dateMatch[3]}` : 'Tarih doğrulanmalı'; const monthYearFormatted = dateMatch ? `${dateMatch[2]}.${dateMatch[3]}` : 'Tarih doğrulanmalı';