Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt birbirine bağlı üç kuralı kapsar: birincil anahtarlar bir UUID sütununda saklanan ULID'lerdir, her kayıt aynı denetim sütunlarını taşır ve okunabilir iş anahtarları core_sequences tablosundan gelir. Temel sınıf temel model ve kimlikler sayfasında açıklanır.
Bağlam¶
Projenin yazılı mühendislik kuralları oluşturma zamanına göre sıralanan ve zaman öneki taşıyan anahtarlar ile bir önek ve bir sayaçtan oluşan, bazıları yıllık sıfırlanan iş anahtarları ister. new_ulid belge dizesi kodun dayandığı özelliği belirtir: değer zamana göre sıralanabilir, küresel olarak benzersizdir ve PostgreSQL'in yerel uuid tipiyle uyumludur (src/cluster_erp/core/ulid.py:8-14). Başka bir gerekçe koddan belirlenemez.
Karar¶
BaseModel.id, varsayılanınew_ulidolan birUUIDbirincil anahtardır (src/cluster_erp/core/models.py:20-24).BaseModel;tenant_id,created_at,created_by,updated_at,updated_by,deleted_at,deleted_by,deactivation_reason,deactivation_noteveversionekler (src/cluster_erp/core/models.py:25-78).- İş anahtarları, varlık tipi başına bir
core_sequencessatırını okuyup ilerletennext_codeişlevinden gelir (src/cluster_erp/core/sequence.py:112-120,src/cluster_erp/core/sequence.py:154-171).
Akış şeması yeni bir kaydın anahtarlarını nasıl aldığını gösterir.
flowchart TD
new["oturuma yeni nesne eklenir"] --> flush["before_flush"]
flush --> pk["_ensure_pk, id boşsa new_ulid atar"]
pk --> stamp["created_by istek aktöründen damgalanır"]
svc["servisin bir iş anahtarına ihtiyacı var"] --> seq["next_code(session, entity_type)"]
seq --> yearly{"yearly_reset?"}
yearly -->|evet| y["PREFIX-YEAR-00001"]
yearly -->|hayır| n["PREFIX-000001"]Düzyazıyla: değişiklik geçmişi dinleyicisi ULID'i eklemeden önce atar; böylece yeni bir kaydın geçmiş satırı kimliğini taşır (src/cluster_erp/core/change_history.py:273-281). İş anahtarına ihtiyaç duyan bir servis next_code çağırır. Yıllık varlıklarda kod yılı ve beş haneli bir sayacı, diğerlerinde altı haneli bir sayacı içerir (src/cluster_erp/core/sequence.py:86-109, src/cluster_erp/core/sequence.py:168-171). Sayaç takvim yılı değiştiğinde yeniden başlar (src/cluster_erp/core/sequence.py:194-197).
Sonuçlar¶
- Kimlikler veritabanında değil Python'da oluşturulur. Dinleyici geçmiş eksiksiz olsun diye onları erken oluşturur (
src/cluster_erp/core/change_history.py:273-278). versionher satırda 1'den başlar (src/cluster_erp/core/models.py:73-78).- 19 varlık tipi sayacını her yıl sıfırlar;
YEARLY_ENTITIESiçinde listelenir (src/cluster_erp/core/sequence.py:88-108, kümeden sayıldı). Diğer tüm varlık tipleri sürekli sayar, örneğinPTYönekli taraflar (src/cluster_erp/core/sequence.py:15). - Eksik dizi satırları açılışta
seed_sequencestarafından tohumlanır (src/cluster_erp/core/sequence.py:123-151).
Kodun uyguladığı yerler¶
| Mekanizma | Neyi denetler | Kaynak |
|---|---|---|
BaseModel |
Her iş modeli anahtarı ve denetim sütunlarını kalıtır | src/cluster_erp/core/models.py:17-78 |
_ensure_pk |
Yeni bir nesne geçmiş satırı yapılmadan önce kimliğini alır | src/cluster_erp/core/change_history.py:273-281 |
_advance |
Eksik bir dizi satırı, anahtar uydurmak yerine hata fırlatır | src/cluster_erp/core/sequence.py:182-199 |
Koddan belirlenemedi: her tablonun bir ULID anahtar kullandığını denetleyen bir test. tests/ içinde bulunmadı (new_ulid ve ulid arandı).
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.