fix: preserve negative money signs in analytics

This commit is contained in:
2026-09-06 16:37:05 +03:00
parent df64ec6b25
commit b406c5b638
3 changed files with 9 additions and 2 deletions
+5
View File
@@ -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. - 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. - 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. - 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.
+3 -2
View File
@@ -8,13 +8,14 @@
export function parseTL(v) { export function parseTL(v) {
if (v == null) return null; if (v == null) return null;
if (typeof v === 'number') return isFinite(v) ? v : 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; if (!s) return null;
const norm = s.includes(',') const norm = s.includes(',')
? s.replace(/\./g, '').replace(',', '.') ? s.replace(/\./g, '').replace(',', '.')
: /^(?:\d+\.\d{3})+$/.test(s) ? s.replace(/\./g, '') : s; : /^(?:\d+\.\d{3})+$/.test(s) ? s.replace(/\./g, '') : s;
const n = parseFloat(norm); const n = parseFloat(norm);
return isFinite(n) ? n : null; return isFinite(n) ? (negative ? -n : n) : null;
} }
export function formatTL(n) { export function formatTL(n) {
+1
View File
@@ -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('12.50 TL'),12.5);
assert.equal(parseTL('1.234 TL'),1234); 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);
assert.equal(parseTL('-1.234,50 TL'),-1234.5);
}); });
test('analytics rejects impossible Turkish calendar dates instead of rolling them over',()=>{ test('analytics rejects impossible Turkish calendar dates instead of rolling them over',()=>{
assert.equal(parseDateTR('31.02.2026'),null); assert.equal(parseDateTR('31.02.2026'),null);