diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 1ec008f..5541360 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1308,3 +1308,8 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - İhale kartı, tarih alanı boş veya beklenen `gg.aa.yyyy` biçiminde değilse artık `01` ve sahte ay göstermiyor. Gün alanında `—`, ay alanında “Tarih doğrulanmalı”, saat yoksa “Saat doğrulanmalı” gösteriliyor. - 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 — 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. +- 31.02.2026 reddi, artık yıl 29.02.2028 ve eğik çizgili geçerli tarih için regresyon testleri eklendi. 281 test ve build başarılı. Genel plan açık. diff --git a/src/services/analytics.js b/src/services/analytics.js index 930e482..ca9da64 100644 --- a/src/services/analytics.js +++ b/src/services/analytics.js @@ -143,7 +143,9 @@ export function parseDateTR(s) { if (!s) return null; const m = String(s).match(/(\d{1,2})[.\/](\d{1,2})[.\/](\d{4})/); if (!m) return null; - return new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1])); + const day=Number(m[1]),month=Number(m[2]),year=Number(m[3]); + const date=new Date(year,month-1,day); + return date.getFullYear()===year && date.getMonth()===month-1 && date.getDate()===day ? date : null; } // --- Firmanın kendi performansı (kullanıcının kanban/takip durumundan) --- diff --git a/tests/review-state.test.mjs b/tests/review-state.test.mjs index 644bc19..0fb9489 100644 --- a/tests/review-state.test.mjs +++ b/tests/review-state.test.mjs @@ -1,6 +1,11 @@ import test from 'node:test'; import assert from 'node:assert/strict'; -import {companyStats} from '../src/services/analytics.js'; +import {companyStats,parseDateTR} from '../src/services/analytics.js'; +test('analytics rejects impossible Turkish calendar dates instead of rolling them over',()=>{ + assert.equal(parseDateTR('31.02.2026'),null); + assert.equal(parseDateTR('29.02.2028')?.getDate(),29); + assert.equal(parseDateTR('30/04/2026')?.getMonth(),3); +}); import {hizliFiltreGecer} from '../src/services/ihaleTarih.js'; import {applyTenderStates} from '../src/services/tenderState.js'; test('review counter uses the same explicit state as reviewed and unread filters',()=>{