Bir onay zinciri (AuthApprovalChain), bir kaynak ve eylem için sıralı bir adım listesidir; her adım ona karar vermesi gereken rolü adlandırır. Bir kaydını onaylatmak isteyen iş modülü, EventBus üzerinden auth modülünden eyleminin zincirini ister ve bir onay talebi (AuthApprovalRequest) gönderir. Onaylayanlar bekleyen işlerini Onaylarım (webapp/i18n/tr.json anahtarı approvals.inbox_title) altında görür ve onaylar, reddeder veya ertelerler. Bu sayfa modules/auth/approval_chains/ ve modules/auth/approvals/ klasörlerini açıklar. Her iş modülünün kendi onay durumları kendi modül sayfasında belgelenir.
Kısaca¶
- Bir zincir
resourceveactionile tanımlanır; yalnızca etkin ve canlı bir zincir bulunur (src/cluster_erp/modules/auth/approval_chains/models.py:13-61,src/cluster_erp/modules/auth/approval_chains/services.py:61-77). - Bir adımın
step_order,role_code,is_required,conditionvetimeout_hoursalanları vardır;step_ordercanlı satırlar arasında zincir başına benzersizdir (src/cluster_erp/modules/auth/approval_chains/models.py:64-106). - Bir talebin dört durumu vardır:
pending,approved,rejectedvecancelled(src/cluster_erp/modules/auth/approvals/services.py:279,src/cluster_erp/modules/auth/approvals/services.py:379-400,src/cluster_erp/modules/auth/approvals/services.py:533). - Karar veren geçerli adımın rolünü taşımalı, talep eden olmamalı ve aynı talebin önceki bir adımına karar vermemiş olmalıdır; sistem yöneticisi rolü yalnızca adım rolünü aşar (
src/cluster_erp/modules/auth/approvals/services.py:311-368). - Son karar EventBus üzerinde
ApprovalCompletedyayar (src/cluster_erp/modules/auth/approvals/routes.py:116-127).
Nasıl çalışır¶
Talep durumları¶
Durum şeması bir onay talebinin yaşamını gösterir.
stateDiagram-v2 [*] --> pending: create_request pending --> pending: approved, sonraki adım var pending --> approved: approved, sonraki adım yok pending --> rejected: rejected pending --> cancelled: talep eden veya yönetici iptal eder approved --> [*] rejected --> [*] cancelled --> [*]
Düz anlatımla:
create_requestzincir satırını kilitler; zincirin canlı ve etkin olmasını ve en az bir canlı adımı olmasını ister ve talebi en düşük canlıstep_orderdeğerindenpendingdurumuyla başlatır (src/cluster_erp/modules/auth/approvals/services.py:229-285).decidetalep satırını kilitler vependingolmayan her şeyi reddeder (src/cluster_erp/modules/auth/approvals/services.py:287-309).- Üç görevler ayrılığı denetimi uygular: talep eden karar veremez, bu talebin bir adımına zaten karar vermiş kullanıcı tekrar karar veremez ve karar veren,
adminveyasystem_admintaşımıyorsa geçerli adımınrole_coderolünü taşımalıdır (src/cluster_erp/modules/auth/approvals/services.py:311-368). - Bir
AuthApprovalDecisionkaydeder. Ret talebi bitirir. Onaycurrent_stepdeğerini sonraki canlı adıma taşır; sonraki adım yoksa talebiapprovedolarak bitirir (src/cluster_erp/modules/auth/approvals/services.py:370-405). canceldurumucancelledyapar; yalnızca talep eden veya bir sistem yöneticisi iptal edebilir (src/cluster_erp/modules/auth/approvals/services.py:514-537).
Karar gövdesi yalnızca approved veya rejected kabul eder (src/cluster_erp/modules/auth/approvals/schemas.py:16).
Erteleme¶
defer gelecekteki bir tarihe kadar kişisel bir erteleme (AuthApprovalSnooze) kaydeder. Talebi değiştirmez, adım ilerletmez ve işi diğer onaylayanlardan gizlemez. Karar vermeyle aynı uygunluk geçerlidir ve yeni bir erteleme çağıranın öncekinin yerini alır (src/cluster_erp/modules/auth/approvals/models.py:115-156, src/cluster_erp/modules/auth/approvals/services.py:407-489). lift_defer çağıranın kendi ertelemesini bitirir (src/cluster_erp/modules/auth/approvals/services.py:491-512). Web uygulamasında bu aksiyonlar Ertele ve Şimdi geri getir olarak görünür (webapp/i18n/tr.json anahtarları approvals.defer, approvals.defer_lift).
Gelen kutusu¶
GET /api/v1/auth/approvals/inbox çağıranın işlem yapabileceği bekleyen talepleri döndürür. Uygunluk (adım rolünü taşımak veya sistem yöneticisi olmak) SQL içinde süzülür ve liste 200 öğeyle sınırlıdır; X-Inbox-Truncated: true başlığı daha fazlasının olduğunu söyler (src/cluster_erp/modules/auth/approvals/routes.py:35-53, src/cluster_erp/modules/auth/approvals/services.py:48-215). Her öğe çağıranın karar verip veremeyeceğini (kendi talebinde asla), adım rolünü taşıyıp taşımadığını ve etkin erteleme tarihini belirtir (src/cluster_erp/modules/auth/approvals/services.py:184-213).
Zinciri düzenleme¶
Zincirin bekleyen bir talebi varken adım değişiklikleri HTTP 409 ile reddedilir. Bekçi, create_request ile aynı zincir satırı kilidini alır; böylece bir gönderim ve bir adım düzenlemesi iç içe geçemez (src/cluster_erp/modules/auth/approval_chains/services.py:102-137, src/cluster_erp/modules/auth/approvals/services.py:236-251).
Uçlar¶
| Uç | İzin | Kaynak |
|---|---|---|
GET, POST /api/v1/auth/approval-chains/ |
approval_chain.read, approval_chain.create |
src/cluster_erp/modules/auth/approval_chains/routes.py:32-52 |
GET, PUT, DELETE /api/v1/auth/approval-chains/{chain_id} |
approval_chain.read, approval_chain.update, approval_chain.delete |
src/cluster_erp/modules/auth/approval_chains/routes.py:55-90 |
GET, POST /api/v1/auth/approval-chains/{chain_id}/steps |
approval_chain.read, approval_chain.update |
src/cluster_erp/modules/auth/approval_chains/routes.py:110-132 |
GET, PUT, DELETE /api/v1/auth/approval-steps/{step_id} |
approval_chain.read, approval_chain.update |
src/cluster_erp/modules/auth/approval_chains/routes.py:135-170 |
GET /api/v1/auth/approvals/pending |
permission.read |
src/cluster_erp/modules/auth/approvals/routes.py:25-32 |
GET /api/v1/auth/approvals/inbox |
yalnızca kimlik doğrulama | src/cluster_erp/modules/auth/approvals/routes.py:35-53 |
POST /api/v1/auth/approvals/ |
permission.assign |
src/cluster_erp/modules/auth/approvals/routes.py:56-74 |
POST /api/v1/auth/approvals/{request_id}/decide |
yalnızca kimlik doğrulama; yetki serviste denetlenir | src/cluster_erp/modules/auth/approvals/routes.py:90-131 |
POST, DELETE /api/v1/auth/approvals/{request_id}/defer |
yalnızca kimlik doğrulama; yetki serviste denetlenir | src/cluster_erp/modules/auth/approvals/routes.py:134-168 |
POST /api/v1/auth/approvals/{request_id}/cancel |
yalnızca kimlik doğrulama; talep eden veya yönetici | src/cluster_erp/modules/auth/approvals/routes.py:171-186 |
GET /api/v1/auth/approvals/entity/{entity_type}/{entity_id} |
permission.read |
src/cluster_erp/modules/auth/approvals/routes.py:189-198 |
Neden böyle kurulmuştur¶
- Projenin yazılı mühendislik kuralları modüller arası iletişimin EventBus üzerinden olmasını ister; auth modülü bunu tek açık kapısı
modules/auth/guards.pyile uygular (src/cluster_erp/modules/auth/guards.py:22-27) ve diğer modüller onaylara yalnızca aşağıdaki sözleşmelerle ulaşır. - Karar ucu yönetimsel bir izin taşımaz, çünkü karar yetkisi serviste denetlenen adım rolüdür (
src/cluster_erp/modules/auth/approvals/routes.py:98-101). - Talep satırı kilidi vardır, çünkü iki onaylayan veya bir çift tıklama aynı adımı iki kez ilerletmemelidir (
src/cluster_erp/modules/auth/approvals/services.py:294-297). - Bir adımın
is_requiredveconditionalanlarıdecideiçinde değerlendirilmez; yorum bunları atlamanın yalnızca daha fazla onay gerektirdiğini söyler (src/cluster_erp/modules/auth/approvals/services.py:355-356). - Erteleme karar değil, gelen kutusu durumudur; bu yüzden karar denetim izi yalnızca gerçek sonuçları kaydeder (
src/cluster_erp/modules/auth/approvals/models.py:115-122).
Kurallar ve sınırlar¶
- Talep eden kendi talebine asla karar vermez ve onu ertelemez (
src/cluster_erp/modules/auth/approvals/services.py:313-318,src/cluster_erp/modules/auth/approvals/services.py:418-423). - Bir talep yaratılmadan önce zincirin en az bir canlı adımı olmalıdır (
src/cluster_erp/modules/auth/approvals/services.py:258-273). - Talepler, kararlar ve ertelemeler diğer her kayıt gibi yumuşak silinen satırlardır (
src/cluster_erp/modules/auth/approvals/services.py:479-482).
Diğer parçalarla etkileşim¶
| Yön | Sözleşme | İşleyici veya çağıran | Kaynak |
|---|---|---|---|
| auth sorguyu yanıtlar | GetApprovalChainForAction |
Module._handle_get_approval_chain |
src/cluster_erp/modules/auth/module.py:83-86, src/cluster_erp/modules/auth/module.py:146-164 |
| auth sorguyu yanıtlar | SubmitForApproval |
Module._handle_submit_for_approval |
src/cluster_erp/modules/auth/module.py:87, src/cluster_erp/modules/auth/module.py:166-188 |
| auth sorguyu yanıtlar | GetApprovalRequestById |
Module._handle_get_approval_request |
src/cluster_erp/modules/auth/module.py:88-91, src/cluster_erp/modules/auth/module.py:190-211 |
| auth yayar | ApprovalCompleted |
decide_approval |
src/cluster_erp/modules/auth/approvals/routes.py:116-127 |
| documents sorar ve gönderir | GetApprovalChainForAction, SubmitForApproval |
belge sürümü gönderme ucu | src/cluster_erp/modules/documents/documents/routes.py:326-350 |
| documents abone olur | ApprovalCompleted |
handle_approval_completed |
src/cluster_erp/modules/documents/module.py:74-77 |
| intranet izin sorar ve gönderir | GetApprovalChainForAction, SubmitForApproval |
_route_approval |
src/cluster_erp/modules/intranet/leave/services.py:740-770 |
| intranet talepleri sorar ve gönderir | GetApprovalChainForAction, SubmitForApproval |
talepler servisi | src/cluster_erp/modules/intranet/requests/services.py:292-305 |
Sözleşme sınıfları src/cluster_erp/core/contracts.py:275-309 içindedir. Bkz. sözleşmeler başvurusu.
Sınırlar ve açık noktalar¶
timeout_hoursbir adımda saklanır ama hiçbir kod onu okumaz; onay zinciri model, şema ve metadata dosyaları dışındatimeout_hoursiçingrephiçbir şey bulmaz.is_requiredveconditionsaklanır ama değerlendirilmez (src/cluster_erp/modules/auth/approvals/services.py:355-356).AuthApprovalSnooze, toplayıcımodules/auth/models.pytarafından dışa aktarılmaz; onay servisi modülü içe aktarıldığında kaydolur (src/cluster_erp/modules/auth/models.py:1-42,src/cluster_erp/modules/auth/approvals/services.py:22-26).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| approval chain | AuthApprovalChain |
Bir kaynak ve eylem için sıralı rol adımları listesi. | Onay Zinciri | src/cluster_erp/modules/auth/approval_chains/models.py:13 |
| approval step | AuthApprovalStep |
Zincirde, rolünü taşıyanların karar verdiği tek bir konum. | onay adımı | src/cluster_erp/modules/auth/approval_chains/models.py:64 |
| approval request | AuthApprovalRequest |
Bir zincire gönderilen, geçerli adımı ve durumu olan tek bir kayıt. | onay talebi | src/cluster_erp/modules/auth/approvals/models.py:26 |
| approval snooze | AuthApprovalSnooze |
Bekleyen bir işi bir onaylayandan bir tarihe kadar gizleyen kişisel erteleme işareti. | erteleme | src/cluster_erp/modules/auth/approvals/models.py:115 |
| segregation of duties | AUTH_SELF_APPROVAL_FORBIDDEN |
Talep edenin veya önceki bir karar verenin bir adıma karar veremeyeceği kuralı. | görevler ayrılığı | src/cluster_erp/modules/auth/approvals/services.py:311 |
İlgili sayfalar¶
- Kimlik, erişim, kiracılık, gizlilik ve lisans
- Roller ve izinler
- Auth modülü
- Documents modülü
- Ana ekran bileşenleri
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.