Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt Cluster ERP'nin parayı nasıl temsil ettiğini kapsar: Python Decimal, veritabanı Numeric, JSON metinleri ve ROUND_HALF_EVEN. Referans verilerden gelen para birimi hassasiyeti dahil mekanizmalar para ve Decimal sayfasında açıklanır.
Bağlam¶
Bir ERP fiyatları, toplamları, maliyetleri ve döviz kurlarını hesaplar. Projenin yazılı mühendislik kuralları para için float kullanımını yasaklar ve her katman için gösterimi listeler. Bir test belge dizesi buna "an absolute project rule" der (tests/test_analytics_contributions.py:121-123). Kurallar ayrıca para birimi simgelerinin, ondalıklarının ve biçimlerinin koddan değil referans verilerden gelmesini ister. Banker yuvarlamasının seçilme gerekçesi koddan belirlenemez.
Karar¶
- Her parasal değer Python'da
Decimal, veritabanındaNumeric'tir. - JSON parayı metin olarak taşır.
- Yuvarlama
ROUND_HALF_EVENkullanır. - Para birimi ve ondalık basamak sayısı referans verilerden gelir.
Akış şeması her katmandaki gösterimi gösterir.
flowchart LR db["PostgreSQL Numeric sütunu"] --> py["Python Decimal"] py --> calc["aritmetik ve ROUND_HALF_EVEN ile quantize"] calc --> ser["field_serializer str döndürür"] ser --> json["JSON metin değeri"] json --> client["istemci metni korur"]
Düzyazıyla: bir değer veritabanından Decimal olarak çıkar, Decimal olarak hesaplanır ve yuvarlanır, JSON'a ulaşmadan önce şema tarafından metne çevrilir. ExchangeRateRead ve ConvertResult seri hale getirici kalıbını gösterir (src/cluster_erp/core/currencies.py:186-204).
Sonuçlar¶
src/cluster_erpaltındaki hiçbir dosyaMapped[float]sütunu bildirmez (grep -rn "Mapped\[float\]"ile arandı).ROUND_HALF_EVENsrc/cluster_erpaltında 32 dosyada geçer,ROUND_HALF_UPhiçbirinde geçmez (grep -rlnile sayıldı).- Değişiklik geçmişi
Decimaldeğerlerini JSON farkında metin olarak yazar (src/cluster_erp/core/change_history.py:108-109). decimaltipindeki kiracı tanımlı bir alan JSONB içinde metin olarak saklanır (src/cluster_erp/core/tenant_fields.py:875-877).assert_known_currencycanlı ve etkin referans verisi olmayan bir para birimi kodunu reddeder (src/cluster_erp/core/currencies.py:30-40).- Bu wiki'deki para örnekleri metin olarak yazılır, örneğin
"amount": "1250.00".
Kodun uyguladığı yerler¶
| Mekanizma | Neyi denetler | Kaynak |
|---|---|---|
test_monetary_measures_are_not_float_backed |
Her parasal analitik ölçü Float olmayan bir Numeric sütuna dayanır |
tests/test_analytics_contributions.py:115-134 |
tests/test_tenant_fields.py |
decimal kiracı alanı asla float değil, metin döndürür |
tests/test_tenant_fields.py:61-62 |
Okuma şemalarında field_serializer |
Decimal alanlar API'den metin olarak çıkar |
src/cluster_erp/core/currencies.py:186-204 |
assert_known_currency |
Para birimi kodları canlı referans verisidir | src/cluster_erp/core/currencies.py:30-40 |
Koddan belirlenemedi: para alanı olan her Pydantic şemasının onu metin olarak seri hale getirdiğini denetleyen genel bir test. tests/ içinde bulunmadı.
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.