From b406c5b638e9e5302cc0a1d690af465a2cf28ce0 Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 16:37:05 +0300 Subject: [PATCH] fix: preserve negative money signs in analytics --- docs/quality/uygulama-durumu.md | 5 +++++ src/services/analytics.js | 5 +++-- tests/review-state.test.mjs | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index e68b496..33139dc 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1365,3 +1365,8 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - Belge deposundaki son kullanma tarihi göstergesi artık yalnız geçerli ISO günlerini hesaplıyor. Bozuk veya yuvarlanabilir bir tarih sessizce gün hesabına girmiyor; kullanıcıya “Tarih doğrulanmalı” uyarısı gösteriliyor. - Geçerli tarihlerde kalan gün, yaklaşan sona erme ve geçmiş belge uyarıları korunuyor. Hazırlık kontrolündeki tarih doğrulamasıyla aynı biçim kuralı kullanılıyor. - 281 test ve build başarılı. Belge deposunda bozuk tarih için ayrı tarayıcı kabulü henüz eklenmedi; genel plan açık. + +### 2026-09-06 — Analitik negatif tutar işareti + +- `parseTL`, metindeki eksi işaretini artık koruyor. İade veya negatif düzeltme tutarları pozitif sözleşme bedeline dönüşmüyor; Türkçe binlik/ondalık ayrıştırma davranışı aynen sürüyor. +- Negatif Türkçe tutar için regresyon eklendi. 283 test ve build başarılı. Finansal kaynakların negatif tutar anlamı ayrıca resmi veri sözleşmesiyle doğrulanmalı; genel plan açık. diff --git a/src/services/analytics.js b/src/services/analytics.js index 88c0e8e..0ba9eb8 100644 --- a/src/services/analytics.js +++ b/src/services/analytics.js @@ -8,13 +8,14 @@ export function parseTL(v) { if (v == null) return null; if (typeof v === 'number') return isFinite(v) ? v : null; - const s = String(v).replace(/[^\d.,]/g, ''); + const text=String(v).trim(), negative=/^-/.test(text); + const s = text.replace(/[^\d.,]/g, ''); if (!s) return null; const norm = s.includes(',') ? s.replace(/\./g, '').replace(',', '.') : /^(?:\d+\.\d{3})+$/.test(s) ? s.replace(/\./g, '') : s; const n = parseFloat(norm); - return isFinite(n) ? n : null; + return isFinite(n) ? (negative ? -n : n) : null; } export function formatTL(n) { diff --git a/tests/review-state.test.mjs b/tests/review-state.test.mjs index 095f809..8b08a60 100644 --- a/tests/review-state.test.mjs +++ b/tests/review-state.test.mjs @@ -5,6 +5,7 @@ test('analytics parses Turkish grouped and decimal money without changing scale' assert.equal(parseTL('12.50 TL'),12.5); assert.equal(parseTL('1.234 TL'),1234); assert.equal(parseTL('1.234,50 TL'),1234.5); + assert.equal(parseTL('-1.234,50 TL'),-1234.5); }); test('analytics rejects impossible Turkish calendar dates instead of rolling them over',()=>{ assert.equal(parseDateTR('31.02.2026'),null);