fix: reject invalid dates in analytics
This commit is contained in:
@@ -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.
|
- İ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.
|
- 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 — 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.
|
||||||
|
|||||||
@@ -143,7 +143,9 @@ export function parseDateTR(s) {
|
|||||||
if (!s) return null;
|
if (!s) return null;
|
||||||
const m = String(s).match(/(\d{1,2})[.\/](\d{1,2})[.\/](\d{4})/);
|
const m = String(s).match(/(\d{1,2})[.\/](\d{1,2})[.\/](\d{4})/);
|
||||||
if (!m) return null;
|
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) ---
|
// --- Firmanın kendi performansı (kullanıcının kanban/takip durumundan) ---
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import test from 'node:test';
|
import test from 'node:test';
|
||||||
import assert from 'node:assert/strict';
|
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 {hizliFiltreGecer} from '../src/services/ihaleTarih.js';
|
||||||
import {applyTenderStates} from '../src/services/tenderState.js';
|
import {applyTenderStates} from '../src/services/tenderState.js';
|
||||||
test('review counter uses the same explicit state as reviewed and unread filters',()=>{
|
test('review counter uses the same explicit state as reviewed and unread filters',()=>{
|
||||||
|
|||||||
Reference in New Issue
Block a user