Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Platform

Açıklama

Yumuşak silme ve kullanımdan kaldırma

Cluster ERP kayıtları silmeden nasıl kullanımdan kaldırır, kimin ve neden kaldırdığını kaydeder ve satırların hâlâ nerede silindiği.

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 NULL etkin, 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_reason ve deactivation_note yazar (src/cluster_erp/core/models.py:58-72, src/cluster_erp/core/change_history.py:242-259).
  • Neden ve not, X-Deact-Reason ve X-Deact-Note istek 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_at alanı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 NULL koşullu kısmi dizinlerle uygulanır; örneğin src/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:

  1. 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).
  2. Bir servis deleted_at alanını ayarlar. Örnekler: AttachmentService.delete ve NoteService.delete (src/cluster_erp/core/attachments.py:155-161, src/cluster_erp/core/notes.py:94-100).
  3. 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şlarsa deleted_by alanına işlemi yapanı, deactivation_reason ve deactivation_note alanlarına bağlamdaki değerleri yazar (src/cluster_erp/core/change_history.py:242-259, src/cluster_erp/core/change_history.py:336-337).
  4. Kanca değişikliği deactivate olarak 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_reasons kataloğ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_at değişmediğinde bir is_active bayrağı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

Sınırlar ve açık noktalar

  • Her modül servisinin varsayılan listelerinde deleted_at IS NULL süzgeci uygulayıp uygulamadığı bu sayfa için denetlenmedi.
  • Analitik özet hücreleri ve intranet analitik olayları üzerinde sa.delete ile 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ı.

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