Cluster ERP'de kullanıcı açısından bir "silme", kaydı kullanımdan kaldırır: satır kalır ve bir kaldırma zamanı, işlemi yapan ve neden alır. Bu sayfa core/models.py, core/change_history.py, core/bulk_operations.py içindeki çekirdek mekanizmayı ve açılıştaki sütun taramasını anlatır ve satırların hâlâ silindiği yerleri listeler. Yeniden etkinleştirme, neden kataloğu ve saklama temizliği records modülüne aittir; bkz. records.
Kısaca¶
deleted_at IS NULLetkin, bir değer kullanımdan kaldırılmış demektir (src/cluster_erp/core/models.py:49-57).- Bir kullanımdan kaldırma satıra
deleted_by,deactivation_reasonvedeactivation_noteyazar (src/cluster_erp/core/models.py:58-72,src/cluster_erp/core/change_history.py:242-259). - Neden ve not,
X-Deact-ReasonveX-Deact-Noteistek başlıklarıyla taşınır (src/cluster_erp/server/dependencies.py:64-72). - Toplu kullanımdan kaldırma nesneleri yükler ve
deleted_atalanını ORM üzerinden ayarlar; böylece değişiklik geçmişi ve neden damgası her satıra uygulanır (src/cluster_erp/core/bulk_operations.py:20-55). - Benzersizlik kısıtları yalnızca canlı satırlara,
WHERE deleted_at IS NULLkoşullu kısmi dizinlerle uygulanır; örneğinsrc/cluster_erp/core/currencies.py:61-74.
Nasıl çalışır¶
Kullanımdan kaldırma akışı¶
Sıra şeması tek bir kullanımdan kaldırma isteğini gösterir.
sequenceDiagram participant C as İstemci participant D as get_db_session participant S as Servis participant H as before_flush kancası participant DB as PostgreSQL C->>D: X-Deact-Reason, X-Deact-Note ile DELETE D->>D: set_deactivation_context(reason, note) D->>S: oturum S->>S: obj.deleted_at = now S->>H: flush H->>H: deleted_by, deactivation_reason, deactivation_note damgala H->>DB: satırı UPDATE et ve core_change_history INSERT et (action deactivate)
Düz metinle:
- Oturum bağımlılığı iki başlığı okur, URL çözümler ve istek bağlamına yazar (
src/cluster_erp/server/dependencies.py:64-72). - Bir servis
deleted_atalanını ayarlar. Örnekler:AttachmentService.deleteveNoteService.delete(src/cluster_erp/core/attachments.py:155-161,src/cluster_erp/core/notes.py:94-100). - Flush anında değişiklik geçmişi kancası
NULL'dan bir değere geçişi saptar (src/cluster_erp/core/change_history.py:229-239). Boşlarsadeleted_byalanına işlemi yapanı,deactivation_reasonvedeactivation_notealanlarına bağlamdaki değerleri yazar (src/cluster_erp/core/change_history.py:242-259,src/cluster_erp/core/change_history.py:336-337). - Kanca değişikliği
deactivateolarak sınıflar;NULL'a geri dönüşactivate'tir (src/cluster_erp/core/change_history.py:197-213). Bkz. değişiklik geçmişi.
Toplu kullanımdan kaldırma¶
bulk_soft_delete(session, model_class, ids, deleted_by=None), ids arasındaki canlı satırları seçer, her birinde deleted_at (verildiyse deleted_by) ayarlar, flush eder ve sayıyı döndürür (src/cluster_erp/core/bulk_operations.py:20-55). Belge dizgisi neden tek bir UPDATE göndermediğini belirtir: Core güncellemesi before_flush kancasını atlar; geçmiş ve neden damgası kaybolurdu (src/cluster_erp/core/bulk_operations.py:26-34). core/bulk_operations.py dışında 54 dosya onu çağırır (grep -rln bulk_soft_delete ile sayıldı). BulkDeleteRequest ve BulkDeleteResponse ortak istek ve yanıt şemalarıdır (src/cluster_erp/core/bulk_operations.py:12-17).
Her tabloda kullanımdan kaldırma sütunları¶
Açılışta sunucu, deleted_at sütunu olup bu sütunları taşımayan her public tabloya deactivation_reason VARCHAR(64) ve deactivation_note TEXT ekleyen tekrar çalıştırılabilir bir SQL bloğu çalıştırır (src/cluster_erp/server/app.py:1111-1149, src/cluster_erp/server/app.py:1152-1166). Blok, birlikte başlayan iki işçinin kilitlenmemesi için işlem düzeyinde bir danışma kilidi alır (src/cluster_erp/server/app.py:1111-1115, src/cluster_erp/server/app.py:1121).
Canlı satır benzersizliği¶
Kullanımdan kaldırılmış bir satır benzersiz değerini kilitlememelidir. Modeller benzersiz dizinleri postgresql_where=text("deleted_at IS NULL") ile bildirir. src/cluster_erp/modules ve src/cluster_erp/core içinde 120 satır hem postgresql_where hem deleted_at IS NULL içerir (grep ile sayıldı). Örnek: uq_core_currencies_code_live (src/cluster_erp/core/currencies.py:59-74). Bir ekleme yine de çakışırsa hata işleyicisi HTTP 409 ile DB_UNIQUE_VIOLATION yanıtı verir ve kısıtı adlandırır (src/cluster_erp/server/error_handler.py:352-390).
Yeniden etkinleştirme ve pasif listeler¶
records modülü bir varlığın kullanımdan kaldırılmış kayıtlarını listeleyen, etiketleri çözen ve bir kaydı yeniden etkinleştiren genel uçlar sunar (src/cluster_erp/modules/records/lifecycle_routes.py:114, src/cluster_erp/modules/records/lifecycle_routes.py:175, src/cluster_erp/modules/records/lifecycle_routes.py:224). Sunucu (module, entity) çiftinden modele giden eşlemeyi açılışta kurar (src/cluster_erp/server/app.py:1090-1099).
Fiziksel silme¶
records modülündeki saklama temizliği, yapılandırılmış süreden eski kullanımdan kaldırılmış satırları ve değişiklik geçmişi satırlarını siler. Belge dizgisi onu "the ONLY place a record is ever physically deleted" (bir kaydın fiziksel olarak silindiği TEK yer) olarak adlandırır (src/cluster_erp/modules/records/retention/purge.py:1-7). Sunucu onu her gün çalıştırır (src/cluster_erp/server/app.py:404-416). Bkz. zamanlanmış işler ve saklama.
orm_delete_where(session, model_class, *where) satırları ORM üzerinden siler; böylece her silme yine bir delete değişiklik geçmişi satırı alır. Belge dizgisi onu, kurtarılabilir birimi üst kayıt olan alt satırlarla sınırlar (src/cluster_erp/core/bulk_operations.py:58-75). calendars, costing ve production modüllerinden çağrılır (src/cluster_erp/modules/calendars/services.py:186, src/cluster_erp/modules/costing/costing_analyses/services.py:318, src/cluster_erp/modules/production/work_centers/services.py:159).
Neden böyle kurulmuştur¶
Projenin yazılı mühendislik kuralları fiziksel silmeyi yasaklar: silme, nedenli bir kullanımdan kaldırmadır ve geçmiş tutulur. src/cluster_erp/core/models.py:49-53 içindeki yorum bunu sütunlar için yineler. bulk_soft_delete belge dizgisi ORM üzerinden gitmenin gerekçesini verir (src/cluster_erp/core/bulk_operations.py:26-34).
Kurallar ve sınırlar¶
- Kullanımdan kaldırma nedeni
core_deactivation_reasonskataloğundan bir koddur; serbest metin not yalnızca neden gerektirdiğinde zorunludur (src/cluster_erp/core/models.py:62-64). Katalog records sayfasında belgelenir. - Değişiklik geçmişi,
deleted_atdeğişmediğinde biris_activebayrağının true'dan false'a geçişini de kullanımdan kaldırma sayar (src/cluster_erp/core/change_history.py:205-212).
Diğer parçalarla etkileşim¶
- Değişiklik geçmişi her kullanımdan kaldırmayı ve etkinleştirmeyi kaydeder.
- Temel model ve kimlikler sütunları listeler.
- Arama, sayfalama ve toplu işlemler toplu şemaları kapsar.
- Web uygulaması neden başlıklarını gönderir; bkz. web uygulaması bölümü.
Sınırlar ve açık noktalar¶
- Her modül servisinin varsayılan listelerinde
deleted_at IS NULLsüzgeci uygulayıp uygulamadığı bu sayfa için denetlenmedi. - Analitik özet hücreleri ve intranet analitik olayları üzerinde
sa.deleteile silinen satırların kural kapsamında kayıt sayılıp sayılmadığı koddan belirlenemedi.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| deactivation | deleted_at |
Bir kaydı kaldırma zamanını ayarlayarak kullanımdan çıkarmak; satır kalır. | kullanımdan kaldırma | src/cluster_erp/core/models.py:49-57 |
| deactivation reason | deactivation_reason |
Bir kaydın neden kullanımdan kaldırıldığını söyleyen katalog girdisi. | devre dışı bırakma nedeni | src/cluster_erp/core/models.py:62-68 |
| live-row uniqueness | postgresql_where kısmi dizini |
Kullanımdan kaldırılmış satırları yok sayan benzersiz dizin. | canlı satır benzersizliği | src/cluster_erp/core/currencies.py:61-74 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.