Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Karar kayıtları

Açıklama

Decimal para

Cluster ERP'deki her para değerinin Decimal olduğu, Numeric olarak saklandığı, JSON metni olarak gönderildiği ve banker yuvarlamasıyla yuvarlandığı kuralın karar kaydı.

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ında Numeric'tir.
  • JSON parayı metin olarak taşır.
  • Yuvarlama ROUND_HALF_EVEN kullanı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_erp altındaki hiçbir dosya Mapped[float] sütunu bildirmez (grep -rn "Mapped\[float\]" ile arandı).
  • ROUND_HALF_EVEN src/cluster_erp altında 32 dosyada geçer, ROUND_HALF_UP hiçbirinde geçmez (grep -rln ile sayıldı).
  • Değişiklik geçmişi Decimal değerlerini JSON farkında metin olarak yazar (src/cluster_erp/core/change_history.py:108-109).
  • decimal tipindeki kiracı tanımlı bir alan JSONB içinde metin olarak saklanır (src/cluster_erp/core/tenant_fields.py:875-877).
  • assert_known_currency canlı 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ı.

Doğrulanan commit 92f8051 · 2026-11-13