Skip to main content

Command Palette

Search for a command to run...

Custom Workflow Development in Dynamics 365 Finance and Operations

Dynamics 365 Finance and Operations için Özel İş Akışı Geliştirme

Updated
7 min read
Custom Workflow Development in Dynamics 365 Finance and Operations
B

Senior Dynamics 365 Developer

Microsoft Dynamics 365 Finance and Operations, işletmelerin süreçlerini daha verimli ve esnek bir şekilde yönetmelerine olanak tanıyan güçlü bir ERP çözümüdür. Standart iş akışları birçok işletmenin ihtiyaçlarını karşılayacak şekilde tasarlanmış olsa da, her şirketin kendine özgü süreçleri ve gereksinimleri olabilir. Bu noktada, Dynamics 365'te özel iş akışları geliştirmenin önemi devreye girer.

Bu yazıda, Dynamics 365 Finance and Operations üzerinde özel iş akışları geliştirmenin adımlarını ve bu süreçte dikkat edilmesi gereken temel noktaları inceleyeceğiz.

1. Yeni Bir Enum Oluşturma

Base Enum

Öncelikle, iş akışınızın durumlarını temsil edecek bir enum oluşturmanız gerekmektedir. Bu enum, iş akışının farklı aşamalarını tanımlayacaktır. Örnek olarak aşağıdaki değerleri içeren bir enum oluşturabilirsiniz. Kullandığım label’ları parantez içinde paylaştım.

  • NotSubmitted (Gönderilmedi)

  • Submitted (Gönderildi)

  • Approved (Onaylandı)

  • InReview (İncelemede)

  • Cancelled (İptal edildi)

  • ChangeRequest (Değişiklik istendi)

  • Returned (İade edildi)

  • Denied (Reddedildi)


2. Tabloya Gerekli Alanları Eklemek

İş akışının uygulanacağı tabloya, iş akışı durumunu izlemek için WorkflowStatus adında bir alan ekleyin. Ayrıca, iş akışı ile ilgili diğer bilgileri gruplamak için WorkflowGroup adında bir field group oluşturun.

Table


3. Gerekli Metotları Eklemek

Tablonuza, iş akışının gönderilip gönderilemeyeceğini kontrol eden canSubmitToWorkflow ve iş akışı durumunu güncelleyen updateWorkflowStatus metotlarını ekleyin. Bu metotlar, iş akışının doğru bir şekilde yönetilmesi için önemlidir.

public boolean canSubmitToWorkflow(str _workflowType = '')
{
    boolean ret;
    ret = super(_workflowType);

    if(this.WorkflowStatus != CustomWorkflowStatus::NotSubmitted)
    {
        ret = false;
    }
    else
    {
        ret = true;
    }

    return ret;
}
public static void updateWorkflowStatus(RefRecId recId, CustomWorkflowStatus status)
{
    CustomWorkflowTable customWorkflowTable;

    ttsbegin;

    select firstonly forupdate customWorkflowTable
        where customWorkflowTable.RecId == recId;

    customWorkflowTable.WorkflowStatus = status;
    customWorkflowTable.update();

    ttscommit;
}

4. İş Akışı Sorgusu (Query) Oluşturma

CustomWorkflowTableWFQuery yeni bir Query oluşturun ve ilgili tabloyu bu sorguya ekleyin. Dynamic Fields özelliğini "Yes" olarak ayarlayın. Bu sorgu, iş akışının hangi veriler üzerinde çalışacağını belirleyecektir.

Query


5. İş Akışı Kategorisi Oluşturma

CustomWorkflowTableWFCategory isminde bir Workflow Category nesnesi oluşturun ve Module özelliğini uygun şekilde ayarlayın. Bu kategori, iş akışınızın hangi modülde yer alacağını belirler.


6. İş Akışı Türü (Workflow Type) Oluşturma

CustomWorkflowTableWFType isminde bir Workflow Type oluşturun. Bu işlem sırasında ilgili Category, Query ve Display Menu Item nesnelerini seçin. Bu adım, iş akışınızın temel yapısını oluşturacaktır.

Son adımda, otomatik olarak oluşacak nesneleri görüyoruz. Onay verdiğimizde, bu nesneler oluşturulacak ve projemize eklenecektir.

Oluşturulan nesnelerin Label ve Help Text bilgilerini, kullanıcı dostu bir deneyim sağlamak için düzenleyin. Özellikle, Submit ve Cancel menü öğelerinin etiketlerini uygun şekilde ayarlayın.

  • CustomWorkflowTableWFTypeSubmitMenuItem (Gönder)

  • CustomWorkflowTableWFTypeCancelMenuItem (İptal)


7. Submit Manager Class’ına Kod Eklemek

İş akışının gönderme işlemini yönetmek için Submit Manager sınıfına gerekli kodları ekleyin. Bu kod, iş akışının başlatılması sırasında gerekli işlemleri yapacaktır.

/// <summary>
/// The CustomWorkflowTableWFTypeSubmitManager menu item action event handler.
/// </summary>
public class CustomWorkflowTableWFTypeSubmitManager 
{
   public static void main(Args args)
   {
        //  TODO:  Write code to execute once a work item is submitted.
        CustomWorkflowTable     customWorkflowTable;

        WorkflowComment         note;
        WorkflowSubmitDialog    workflowSubmitDialog;
        WorkflowCorrelationId   workflowCorrelationId;
        WorkflowTypeName        workflowTypeName = workFlowTypeStr(CustomWorkflowTableWFType);

        //Opens the submit to workflow dialog.
        workflowSubmitDialog =    WorkflowSubmitDialog::construct(args.caller().getActiveWorkflowConfiguration());
        workflowSubmitDialog.run();

        if (workflowSubmitDialog.parmIsClosedOK())
        {

            customWorkflowTable = args.record();

            // Get comments from the submit to workflow dialog.
            note = workflowSubmitDialog.parmWorkflowComment();

            try
            {
                ttsbegin;
                workflowCorrelationId = Workflow::activateFromWorkflowType(workflowTypeName, customWorkflowTable.RecId, note, NoYes::No);
                customWorkflowTable.WorkflowStatus = CustomWorkflowStatus::Submitted;
                customWorkflowTable.update();
                ttscommit;

                // Send an Infolog message.
                info("İş akışına gönderildi.");

            }
            catch (Exception::Error)
            {
                error("İş akışında hata");
            }

        }

        args.caller().updateWorkFlowControls();
   }

}

8. Event Handler Class’ına Kod Eklemek

İş akışı başlatıldığında, iptal edildiğinde veya tamamlandığında uygun iş akışı durumlarını günceller. Esnekliği sayesinde iş süreçlerinin doğru bir şekilde takip edilmesini sağlar.

/// <summary>
/// The CustomWorkflowTableWFTypeEventHandler workflow event handler.
/// </summary>
public class  CustomWorkflowTableWFTypeEventHandler implements WorkflowCanceledEventHandler,  
 WorkflowCompletedEventHandler,
 WorkflowStartedEventHandler
{
   public void started(WorkflowEventArgs _workflowEventArgs)
   {
        // TODO:  Write code to execute once the workflow is started.
        CustomWorkflowTable::updateWorkflowStatus(_workflowEventArgs.parmWorkflowContext().parmRecId(),CustomWorkflowStatus::Submitted);
   }

   public void canceled(WorkflowEventArgs _workflowEventArgs)
   {
        // TODO:  Write code to execute once the workflow is canceled.
        CustomWorkflowTable::updateWorkflowStatus(_workflowEventArgs.parmWorkflowContext().parmRecId(),CustomWorkflowStatus::Cancelled);
   }

   public void completed(WorkflowEventArgs _workflowEventArgs)
   {
        // TODO:  Write code to execute once the workflow is completed.
        CustomWorkflowTable::updateWorkflowStatus(_workflowEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::Approved);
   }

}

9. Formda iş akışının etkinleştirilmesi

Formumuzda iş akışını etkinleştirmek için “Workflow enabled” özelliğini “Yes” olarak ayarlıyoruz. Ardından, “Workflow Data Source” ve “Workflow Type” özelliklerine ilgili nesnelerimizi atıyoruz.

Buraya kadar tüm adımları tamamladıktan sonra projemizi derleyip senkronize ediyoruz.


10. İş Akışı Onay (Workflow Approval) Oluşturma

CustomWorkflowTableWFApproval isminde bir Workflow Approval oluşturun. Bu işlem sırasında ilgili Workflow document, Field group ve Display Menu Item nesnelerini seçin. Workflow Approval, iş akışları içinde belge veya işlemlerin onaylanmasını sağlayan bir bileşendir.

Son adımda ise otomatik olarak oluşacak nesneleri görüyoruz. Onay verdiğimizde, bu nesneler oluşturulacak ve projemize eklenecek.

Oluşturulan nesnelerin Label ve Help Text bilgilerini, kullanıcı dostu bir deneyim sağlamak için düzenleyin. Kullandığım label’ları parantez içinde paylaştım.

  • CustomWorkflowTableWFApprovalApprove (Onayla)

  • CustomWorkflowTableWFApprovalDelegateMenuItem (Görevlendir)

  • CustomWorkflowTableWFApprovalReject (Reddet)

  • CustomWorkflowTableWFApprovalRequestChange (İstek değişikliği)

  • CustomWorkflowTableWFApprovalResubmitMenuItem (Yeniden gönder)


11. Workflow Approval Event Handler Class’ına Kod Eklemek

Bu sınıf, iş akışı onay sürecindeki olayları yönetmek için geliştirilmiştir. İş akışı elementinin durumu değiştiğinde (başlatıldığında, iptal edildiğinde, tamamlandığında vb.) uygun durum güncellemelerini yapar. Aşağıdaki kodu workflow approval event handler class’ına ekleyelim.

/// <summary>
/// The CustomWorkflowTableWFApprovalEventHandler workflow outcome event handler.
/// </summary>
public final class CustomWorkflowTableWFApprovalEventHandler implements WorkflowElementCanceledEventHandler,
    WorkflowElemChangeRequestedEventHandler,
    WorkflowElementCompletedEventHandler,
    WorkflowElementReturnedEventHandler,
    WorkflowElementStartedEventHandler,
    WorkflowElementDeniedEventHandler,
    WorkflowWorkItemsCreatedEventHandler
{
    public void started(WorkflowElementEventArgs _workflowElementEventArgs)
    {
        // TODO:  Write code to execute once the workflow is started.
        CustomWorkflowTable::updateWorkflowStatus(_workflowElementEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::InReview);
    }

    public void canceled(WorkflowElementEventArgs _workflowElementEventArgs)
    {
        // TODO:  Write code to execute once the workflow is canceled.
        CustomWorkflowTable::updateWorkflowStatus(_workflowElementEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::Cancelled);
    }

    public void completed(WorkflowElementEventArgs _workflowElementEventArgs)
    {
        // TODO:  Write code to execute once the workflow is completed.
        CustomWorkflowTable::updateWorkflowStatus(_workflowElementEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::Approved);
    }

    public void denied(WorkflowElementEventArgs _workflowElementEventArgs)
    {
        // TODO:  Write code to execute once the workflow is denied.
        CustomWorkflowTable::updateWorkflowStatus(_workflowElementEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::Denied);
    }

    public void changeRequested(WorkflowElementEventArgs _workflowElementEventArgs)
    {
        // TODO:  Write code to execute once change is requested for the workflow.
        CustomWorkflowTable::updateWorkflowStatus(_workflowElementEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::ChangeRequest);
    }

    public void returned(WorkflowElementEventArgs _workflowElementEventArgs)
    {
        // TODO:  Write code to execute once the workflow is returned.
        CustomWorkflowTable::updateWorkflowStatus(_workflowElementEventArgs.parmWorkflowContext().parmRecId(), CustomWorkflowStatus::Denied);
    }

    public void created(WorkflowWorkItemsEventArgs _workflowWorkItemsEventArgs)
    {
        // TODO:  Write code to execute once work items are created.
        // Burada WorkflowStatus ile ilgili bir işlem yapmayın.
    }

}

12. Workflow Approval Resubmit Class’ına Kod Eklemek

Bu sınıf, Dynamics 365 Finance and Operations’da iş akışı öğelerinin yeniden gönderilmesi işlemini yönetmek amacıyla geliştirilmiştir. İş akışı öğesinin yeniden gönderilmesi, iş akışının doğru bir şekilde devam etmesini sağlar. Aşağıdaki kodu workflow approval resubmit class’ına ekleyelim.

/// <summary>
/// The CustomWorkflowTableWFApprovalResubmitActionMgr menu item action event handler.
/// </summary>
public class CustomWorkflowTableWFApprovalResubmitActionMgr 
{
    public static void main(Args args)
    {
        //  TODO:  Write code to execute once work items are resubmitted.
        CustomWorkflowTable workflowTable;
        RecId recId = args.record().RecId;
        WorkflowComment workflowComment;
        WorkflowWorkItemActionManager workflowWorkItemActionManager = new WorkflowWorkItemActionManager();

        // Initiating the Re-Submit process.
        workflowWorkItemActionManager.parmArgs(args);
        workflowWorkItemActionManager.parmCaller(args.caller());
        workflowWorkItemActionManager.run();

        if (workflowWorkItemActionManager.parmIsActionDialogClosedOK())
        {
            workflowTable    = args.record();
            workflowComment  = workflowWorkItemActionManager.parmWorkflowComment();

            CustomWorkflowTable::updateWorkflowStatus(recId, CustomWorkflowStatus::Submitted);

            info("İş akışına tekrar gönderildi.");

        }

        args.caller().updateWorkFlowControls();
    }

}

13. Workflow Type Referanslarının Yapılandırılması

Şimdi sıra, Workflow Type nesnemize referans eklemeye geldi. Workflow Approval nesnemizi referans olarak veriyoruz. Bu işlem, Workflow Type nesnesinin iş akışı onay mekanizmasıyla entegre çalışmasını sağlar.


14. İş Akışı Yapılandırmalarından Önce Son Adım

Workflow Type ve Workflow Approval nesnelerinin Label ve Help Text bilgilerini, kullanıcı dostu bir deneyim sağlamak için düzenleyin.

Workflow Type

Workflow Approval

Buraya kadar tüm adımları tamamladıktan sonra projemizi derleyip senkronize ediyoruz.


15. İş Akışı Yapılandırmaları

Şimdi sıra arayüzde iş akışını yapılandırmaya geldi. İlgili modülünüzün Ayarlar yada Kurulum altında ki “İş akışları” ekranından, Yeni dedikten sonra bir diyalog açılır buradan kendi iş akışımıza tıklıyarak, kurulumları yapabiliriz.

İş akışları ekranından Yeni dedikten sonra bir diyalog açılır buradan kendi iş akışımıza tıklıyoruz.

İş akışımızı yapılandırdıktan sonra, formumuz üzerinde iş akışlarının aktif hale geldiğini gözlemleyebiliriz. Bu yapılandırma, talebe göre değiştiği için detaylara yer verilmiyor. Ancak doğru yapılandırma, iş akışlarının sorunsuz bir şekilde çalışmasını sağlar.

Sonuç olarak formumuzda iş akışı aktif hale geldi.

Bu adımları takip ederek, Dynamics 365 Finance and Operations üzerinde işletmenizin özel ihtiyaçlarına uygun iş akışları geliştirebilirsiniz. Her adımda dikkatli olmak ve sistemin genel işleyişini göz önünde bulundurmak, başarılı bir iş akışı geliştirme süreci için kritik öneme sahiptir.


16. Like Like Like 😊

Yazımı beğendiyseniz, lütfen bir beğeni bırakın ve görüşlerinizi yorum kısmında paylaşın. Sorularınız veya düşüncelerinizle katkıda bulunabilirsiniz. Her türlü geri bildirim benim için çok değerli!

Dynamics 365 FO Blog

Part 12 of 33

Microsoft Dynamics 365 for Finance and Operations ürünü ile ilgili yaptığım işler ve tecrübelerim

Up next

Processing Multiple Selected Records in Dynamics 365 with MultiSelectionHelper

Dynamics 365'te MultiSelectionHelper ile Seçili Kayıtları İşlemek