fix: reject invalid dates in analytics

This commit is contained in:
2026-09-06 16:28:17 +03:00
parent d00177ccc8
commit 5a4371f5ed
3 changed files with 14 additions and 2 deletions
+5
View File
@@ -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.
+3 -1
View File
@@ -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) ---
+6 -1
View File
@@ -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',()=>{