fix: parse decimal money values without scale errors

This commit is contained in:
2026-09-06 16:32:59 +03:00
parent 04f24d78a3
commit 1c2651fc0e
3 changed files with 15 additions and 3 deletions
+5
View File
@@ -1330,6 +1330,11 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö
- Miktarı veya birimi kaynakta bilinmeyen kalemler fiyat analizine alınmıyor; böylece birim fiyat karşılaştırması doğrulanmamış kapsamla öneri üretmiyor. - Miktarı veya birimi kaynakta bilinmeyen kalemler fiyat analizine alınmıyor; böylece birim fiyat karşılaştırması doğrulanmamış kapsamla öneri üretmiyor.
- Kutu/adet ve bilinmeyen miktar regresyonu eklendi. 282 test ve build başarılı. Gerçek pazar verisiyle fiyat karşılaştırması ve kur kaynağı kabulü hâlâ plan maddesi; genel plan açık. - Kutu/adet ve bilinmeyen miktar regresyonu eklendi. 282 test ve build başarılı. Gerçek pazar verisiyle fiyat karşılaştırması ve kur kaynağı kabulü hâlâ plan maddesi; genel plan açık.
### 2026-09-06 — Analitik para biçimi ayrıştırması
- `parseTL`, nokta içeren değerleri eskiden her zaman binlik ayraç sayıyordu; `12.50 TL` bu nedenle 1250 olabiliyordu. Artık virgüllü Türkçe biçim, üç haneli binlik gruplar ve ondalık noktalı değerler ayrı ayrıştırılıyor.
- `12.50`, `1.234` ve `1.234,50` için regresyonlar eklendi. Fiyat, sözleşme ve pazar istatistiklerinde tutar ölçeğinin yanlış değişmesi engellendi. 283 test ve build başarılı; genel plan açık.
### 2026-09-06 — Belge son kullanma tarihi doğrulaması ### 2026-09-06 — Belge son kullanma tarihi doğrulaması
- 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.
+4 -2
View File
@@ -4,13 +4,15 @@
* ilanları) analizler otomatik zenginleşir. * ilanları) analizler otomatik zenginleşir.
*/ */
// "22.800,00 TRY" / "1.234.567,89 TL" gibi metinleri sayıya çevir // "22.800,00 TRY" / "1.234.567,89 TL" / "12.50 TL" gibi metinleri sayıya çevir
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 s = String(v).replace(/[^\d.,]/g, '');
if (!s) return null; if (!s) return null;
const norm = s.replace(/\./g, '').replace(',', '.'); const norm = s.includes(',')
? s.replace(/\./g, '').replace(',', '.')
: /^(?:\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) ? n : null;
} }
+6 -1
View File
@@ -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,parseDateTR} from '../src/services/analytics.js'; import {companyStats,parseDateTR,parseTL} from '../src/services/analytics.js';
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);
});
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);
assert.equal(parseDateTR('29.02.2028')?.getDate(),29); assert.equal(parseDateTR('29.02.2028')?.getDate(),29);