Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt, Cluster ERP'nin hiçbir kaydının bir kullanıcı eylemiyle kaldırılmadığı kuralı kapsar. Silme nedenli bir kullanımdan kaldırmaya dönüşür, her kullanımdan kaldırma core_change_history içinde tutulur ve satırları kalıcı olarak yalnız saklama temizliği kaldırır. Sütunlar ve rotalar yumuşak silme ve kullanımdan kaldırma sayfasında açıklanır.
Bağlam¶
Projenin yazılı mühendislik kuralları fiziksel silmeyi yasaklar ve üç bilinçli istisna sayar: sahibiyle toptan yenilenen bağımlı alt satırlar, yeniden kurulan türetilmiş özet hücreleri ve saklama temizliğiyle kaldırılan olay satırları. Daha önceki bir mekanizma olan veritabanı tetikleyici kasası Temmuz 2026'da kaldırıldı. Onu kaldıran göç nedenini belirtir: kullanımdan kaldırmalar kalıcı değişiklik geçmişine kaydedilir ve tek fiziksel silme saklama temizliğidir (migrations/versions/dropvault_0001_remove_deletion_vault.py:1-11).
Karar¶
- Bir kayıt
deleted_atboşken etkin, bir zaman taşıdığında kullanımdan kaldırılmıştır.deleted_by,deactivation_reasonvedeactivation_notekimin ve neden yaptığını kaydeder (src/cluster_erp/core/models.py:49-72). - Bir kullanıcının silmesi kullanımdan kaldırır; kayıt pasif kayıtlar arasında listelenebilir ve yeniden etkinleştirilebilir (
src/cluster_erp/modules/records/lifecycle_routes.py:115-133,src/cluster_erp/modules/records/lifecycle_routes.py:225-249). - Her kullanımdan kaldırma ve her değişiklik değişiklik geçmişi dinleyicisi tarafından otomatik kaydedilir.
- Saklama temizliği tek genel fiziksel silmedir (
src/cluster_erp/modules/records/retention/purge.py:1-6).
Akış şeması bir kaydın yaşamını gösterir.
flowchart TD del["kullanıcı bir kaydı siler"] --> deact["deleted_at ayarlanır, neden ve not damgalanır"] deact --> hist["before_flush core_change_history'ye deactivate satırı yazar"] deact --> passive["kayıt pasif kayıtlar arasında listelenir"] passive -->|etkinleştir| live["deleted_at temizlenir, activate satırı yazılır"] passive -->|saklama süresi geçti| purge["purge_expired satırı kaldırır"]
Düzyazıyla: deleted_at boştan bir değere geçtiğinde dinleyici aktörü, nedeni ve notu satıra damgalar ve bir deactivate geçmiş satırı yazar (src/cluster_erp/core/change_history.py:331-342). Etkinleştirme deleted_at alanını temizler ve bir activate satırı yazar. Yapılandırılan yıl sayısından sonra purge_expired pasif satırları ve eski geçmişi siler (src/cluster_erp/modules/records/retention/purge.py:33-45).
Sonuçlar¶
- Toplu kullanımdan kaldırma her nesneyi yükler ve
deleted_atalanını ORM üzerinden ayarlar; böylece geçmiş ve neden damgası her satıra uygulanır (src/cluster_erp/core/bulk_operations.py:20-55). - Benzersizlik
WHERE deleted_at IS NULLiçeren kısmi indekslerle yalnız canlı satırlara uygulanır; böylece pasif bir değer yeniden kullanılabilir. Örnek:uq_core_deactivation_reasons_code_live(src/cluster_erp/modules/records/deactivation_reasons/models.py:18-25). - İş verisi üzerindeki sorgular pasif satırları dışarıda bırakır; analitik testleri bunu kuralın bir sonucu olarak belirtir (
tests/test_analytics_gates.py:423). - Bilinçli istisnalar ORM üzerinden gider; böylece geçmiş her kaldırmayı yine kaydeder:
| İstisna | Satırlar | Kaynak |
|---|---|---|
| Sahibiyle yenilenen alt satırlar | Takvim şablon satırları ve istisna vardiyaları | src/cluster_erp/modules/calendars/services.py:186-190, src/cluster_erp/modules/calendars/services.py:596-600 |
| Sahibiyle yenilenen alt satırlar | Tedarikçi teklifi koşul ve ölçek satırları | src/cluster_erp/modules/purchasing_quotations/quotations/services.py:931-937 |
| Sahibiyle yenilenen alt satırlar | Maliyet kırılım kalemleri ve oran anlık görüntüleri | src/cluster_erp/modules/costing/costing_analyses/services.py:315-329 |
| Sahibiyle yenilenen alt satırlar | İş merkezi operasyon tipleri | src/cluster_erp/modules/production/work_centers/services.py:152-163 |
| Türetilmiş özet hücreleri | Yeniden kurulan analitik özet hücreleri | src/cluster_erp/modules/analytics/summaries.py:245 |
| Saklama temizliği | Pasif satırlar ve eski geçmiş | src/cluster_erp/modules/records/retention/purge.py:33-45 |
orm_delete_where, alt satır durumları için ortak yardımcıdır (src/cluster_erp/core/bulk_operations.py:58-75).
Kodun uyguladığı yerler¶
| Mekanizma | Neyi denetler | Kaynak |
|---|---|---|
BaseModel yumuşak silme sütunları |
Her iş tablosu kullanımdan kaldırma durumunu taşır | src/cluster_erp/core/models.py:49-72 |
_capture_changes dinleyicisi |
Her kullanımdan kaldırma ve her ORM silmesi geçmişe yazılır | src/cluster_erp/core/change_history.py:318-351 |
tests/test_live_row_uniqueness.py |
Model ve veritabanı kısmi benzersiz indeksleri uyuşur; kullanıcı değerlerinde düz benzersizlik yok | tests/test_live_row_uniqueness.py:1-15 |
test_the_screen_never_offers_a_delete_action |
Analitik istatistik ekranı silme veya güncelleme ifadesi içermez | tests/test_analytics_statistics.py:206-217 |
Koddan belirlenemedi: temizlik ve listelenen istisnalar dışındaki DELETE ifadelerini reddeden depo çapında bir test. tests/ içinde bulunmadı.
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.