18. İş Akışı E-posta Desenleri

Bu bölüm, Yerel (Native) BPMN Desteği kullanarak yaygın 6 iş akışı senaryosu için otomatik e-posta bildirimlerinin nasıl etkinleştirileceğini açıklar.

Sistemi "Tak-Çalıştır" (Plug-and-Play) dinleyicileri (listeners) destekleyecek şekilde güncelledik. Java kodu yazmanıza gerek yoktur; sadece BPMN dosyanızı aşağıda gösterildiği gibi yapılandırmanız yeterlidir.

1. Bir Süreç Başladığında Birine E-posta Gönder

StartEvent (Başlangıç Olayı) üzerinde bir Yürütme Dinleyicisi (Execution Listener) kullanın. Bu, iş akışı başlar başlamaz anında bir e-posta gönderir.

BPMN XML

<startEvent id="start" flowable:initiator="initiator">
    <extensionElements>
        <!-- Native Execution Listener using our universal delegate -->
        <flowable:executionListener event="start" delegateExpression="${sendReminder}">
            <!-- Configure Recipient, Subject, and Body -->
            <flowable:field name="to" stringValue="admin@workingflow.com"/>
            <flowable:field name="subject" stringValue="New Workflow Started"/>
            <flowable:field name="body" expression="Process ${processDefinitionId} started by ${initiator}"/>
        </flowable:executionListener>
    </extensionElements>
</startEvent>

2. Bir Süreç Sona Erdiğinde Birine E-posta Gönder

EndEvent (Bitiş Olayı) üzerinde bir Yürütme Dinleyicisi (Execution Listener) kullanın. Bu, süreç başarıyla tamamlandığında bir e-posta gönderileceğini garanti eder.

BPMN XML

<endEvent id="end">
    <extensionElements>
        <flowable:executionListener event="end" delegateExpression="${sendReminder}">
            <flowable:field name="to" expression="${initiator}"/>
            <flowable:field name="subject" stringValue="Workflow Completed"/>
            <flowable:field name="body" stringValue="Your request has been fully processed."/>
        </flowable:executionListener>
    </extensionElements>
</endEvent>

3. Bir Görev Atandığında veya Ulaşılabilir Olduğunda E-posta Gönder

${taskEmailListener}, görev bildirimi için iki farklı olayı destekler. Görevin nasıl atandığına bağlı olarak doğru olanı seçin.

event="create" — Görev İlk Göründüğünde (Çoğu durum için önerilir)

Bir görev erişilebilir (available) olduğu anda tetiklenir — ister doğrudan bir atananı (assignee) olsun, ister bir aday gruba (candidate group) açık olsun. Bu, rol tabanlı görevler için doğru olaydır çünkü henüz kimse üzerine almadan (claim) oluşturulma aşamasında tetiklenir.

  • Doğrudan atama (direct assignment) görevleri için: atanan kişiye hemen e-posta gönderir
  • Aday grup (candidate group) görevleri için: görev ortaya çıktığı anda rol grubundaki tüm üyelere e-posta gönderir
<!-- Works for direct assignment AND candidate group tasks -->
<userTask id="managerApproval" name="Manager Approval" flowable:candidateGroups="ROLE_MANAGER">
    <extensionElements>
        <flowable:taskListener event="create" delegateExpression="${taskEmailListener}">
            <flowable:field name="subject" stringValue="New Task Available"/>
            <flowable:field name="body" stringValue="A new approval task is waiting for your team."/>
        </flowable:taskListener>
    </extensionElements>
</userTask>

event="assignment" — Görev Üzerine Alındığında veya Doğrudan Atandığında

Göreve atanan kişi (assignee) açıkça belirlendiğinde tetiklenir — bunun nedeni ya görevin oluşturulma sırasında doğrudan atanmış olması ya da havuzdaki bir görevi bir kullanıcının kendi üzerine almış olmasıdır.

  • Doğrudan atama görevleri için: oluşturulma anında tetiklenir (create ile aynı zamanda)
  • Aday grup görevleri için: yalnızca bir kullanıcı görevi kendi üzerine aldığında (claims) tetiklenir — görev ilk ortaya çıktığında rol üyelerine bildirim GÖNDERİLMEZ

⚠ Doğrudan atanan (directly-assigned) aynı göreve hem create hem de assignment eklemeyin. Her iki olay da doğrudan atanan görevler için görevin oluşturulma anında tetiklenir ve mükerrer e-postalara neden olur. Sadece birini kullanın.

<!-- Useful for notifying someone when they claim a pooled task -->
<userTask id="reviewTask" name="Document Review" flowable:candidateGroups="ROLE_MANAGER">
    <extensionElements>
        <flowable:taskListener event="assignment" delegateExpression="${taskEmailListener}">
            <flowable:field name="subject" stringValue="Task Claimed"/>
            <flowable:field name="body" stringValue="You have claimed this task. Please complete it promptly."/>
        </flowable:taskListener>
    </extensionElements>
</userTask>

4. Bir Görev Tamamlandığında E-posta Gönder

event="complete" içeren bir Görev Dinleyicisi (Task Listener) kullanın. Bu, süreç başlatıcısına, bir yöneticiye veya herhangi bir başka tarafa bir adımın bittiğini bildirmek için faydalıdır.

complete olayları için to alanı zorunludur. Eğer to alanı eksikse veya belirtilen e-posta sistemdeki kayıtlı bir kullanıcıya ait değilse, bildirim atlanır ve hata Hata Günlüklerine (Error Logs) kaydedilir (görevin kendi tamamlanma süreci BUNDAN ETKİLENMEZ).

<userTask id="reviewTask" name="Review Documents">
    <extensionElements>
        <!-- Triggers when the user clicks Complete -->
        <flowable:taskListener event="complete" delegateExpression="${taskEmailListener}">
            <!-- Required: who to notify. Use an expression to reference a process variable. -->
            <flowable:field name="to" expression="${initiator}"/>
            <flowable:field name="subject" stringValue="Review Finished"/>
            <flowable:field name="body" stringValue="The manager has completed the review."/>
        </flowable:taskListener>
    </extensionElements>
</userTask>

Doğrulama: to alanı çalışma zamanında değerlendirilir. Eğer sistemde kayıtlı olmayan bir e-posta içeriyorsa, Hata Günlükleri (Error Logs) ekranına bir uyarı kaydedilir ve e-posta sessizce atlanır. Görevin tamamlanması hiçbir zaman engellenmez.

5. Bir Role (Gruba) E-posta Göndermek

Belirli bir Role sahip tüm kullanıcılara (ör. ROLE_MANAGER) e-posta gönderebilirsiniz.

Yöntem A: Süreç Başlangıcı/Bitişi (Execution Listener) ${sendReminder} içinde toRole alanını kullanın.

<flowable:executionListener event="start" delegateExpression="${sendReminder}">
    <!-- Emails everyone with ROLE_MANAGER -->
    <flowable:field name="toRole" stringValue="ROLE_MANAGER"/>
    <flowable:field name="subject" stringValue="Attention Managers"/>
    <flowable:field name="body" stringValue="A new high-priority process has started."/>
</flowable:executionListener>

Yöntem B: Görev Ataması (Candidate Groups) Bir görevi Aday Gruba (Candidate Group) atarsanız, görev göründüğü an tüm grup üyelerini bilgilendirmek için event="create" olayını kullanın.

⚠ Önemli: event="assignment" DEĞİL, event="create" kullanın. assignment olayı yalnızca biri görevi kendi üzerine aldığında (claim) tetiklenir — görev ilk erişilebilir olduğunda rol üyeleri hiçbir bildirim almayacaktır.

<userTask id="groupTask" name="Group Review" flowable:candidateGroups="ROLE_MANAGER">
    <!-- 'create' fires when the task first appears — before anyone claims it -->
    <flowable:taskListener event="create" delegateExpression="${taskEmailListener}">
        <flowable:field name="subject" stringValue="New Pooled Task"/>
        <flowable:field name="body" stringValue="A new task is available for the Manager team to claim."/>
    </flowable:taskListener>
</userTask>

6. Dinamik Alıcı Seçimi

Önceki bir Kullanıcı Görevi formunda seçilen bir Süreç Değişkeni (Process Variable) kullanarak, kullanıcıların e-postayı kimin alacağını seçmesine izin verebilirsiniz.

Adım 1: Kullanıcı Alıcıyı Seçer Önceki bir Kullanıcı Görevi formunda, seçilen kişinin e-postasını bir değişkene kaydetmek için bir açılır liste (dropdown) kullanın, örneğin targetUserEmail.

Adım 2: Değişkeni BPMN'de Kullanın to alanı ifadesinde (expression) o değişkene başvurun.

<serviceTask id="sendDynamicEmail" flowable:delegateExpression="${sendReminder}">
    <extensionElements>
        <!-- Uses the variable 'targetUserEmail' set in previous form -->
        <flowable:field name="to" expression="${targetUserEmail}"/>
        <flowable:field name="subject" stringValue="You were selected"/>
        <flowable:field name="body" stringValue="The previous user chose you for this step."/>
    </extensionElements>
</serviceTask>

Alıcının Gördükleri

Her hatırlatma e-postası markalı bir HTML e-postası (üretim ortamında) olarak gönderilir. Şunları içerir:

Bölüm İçerik
Üst Bilgi (Header) Workingflow markalaması
Konu Başlığı (Subject banner) subject alanının değeri
Süreç (Process) Otomatik çözümlenen iş akışı adı
Görev (Task) Otomatik çözümlenen aktif görev adı
Mesaj (Message) body alanının değeri
Alt Bilgi (Footer) Otomatik mesaj uyarısı (disclaimer)

Etiketlerin dili ("Process", "Task", "Message", footer text) Yönetici → Sistem Ayarları'ndaki sistem dili ayarı tarafından kontrol edilir.

Geliştirme ortamında (default profili), DemoEmailService gerçek bir e-posta göndermek yerine süreç adı, görev adı ve gövde dahil olmak üzere tüm alanları konsola (console) yazar.