X++ code to submit and approve the invent movement workflow using custom service in dynamics 365 F&O

Request Class :

[DataContractAttribute("BASMSInventoryMovementRequestContract")]

class BASMSInventoryMovementRequestContract

{

    str journalId;

    str dataAreaId;

    [DataMemberAttribute("JournalId")]

    public str parmjournalId(str _journalId = journalId)

    {

        journalId = _journalId;

        return journalId;

    }

    [DataMemberAttribute("dataAreaId")]

    public str parmdataAreaId(str _dataAreaId = dataAreaId)

    {

        dataAreaId = _dataAreaId;

        return dataAreaId;

    }


Response Class :

[DataContractAttribute("BASMSInventoryMovementResponseContract")]

class BASMSInventoryMovementResponseContract

{

    str workFlowApprovalStatus;

    List errorList;

    [DataMember('WorkflowApprovalStatus')]

    public str parmworkFlowApprovalStatus(str _workFlowApprovalStatus = workFlowApprovalStatus)

    {

        workFlowApprovalStatus = _workFlowApprovalStatus;

        return workFlowApprovalStatus;

    }

    [DataMember('ErrorList')]

    public List parmErrorList(List _errorList = errorList)

    {

        errorList = _errorList;

        return errorList;

    }

    private static BASMSInventoryMovementResponseContract construct()

    {

        return new BASMSInventoryMovementResponseContract();

    }


    public static BASMSInventoryMovementResponseContract newFromTableRecord(str _message,List _errorList)

    {

        BASMSInventoryMovementResponseContract  contract = BASMSInventoryMovementResponseContract::construct();

        contract.parmworkFlowApprovalStatus(_message);

        contract.parmErrorList(_errorList);

        return contract;

    }

}


Submit and Approve Helper Class :

class BASMSInventoryMovementHelper

{

    SysInfoLogEnumerator        infoLogEnum;

    SysInfologMessageStruct     infoMessageStruct;

// submit helper class

    [AifCollectionTypeAttribute('return', Types::Class, classStr(BASMSInventoryMovementResponseContract))]

    public List submitWorkflowDetails(str _journalId , str _dataAreaId)

    {

        InventJournalTable         journalTable;

        str                        message,error;

        str  journalId              = _journalId;

        str  dataAreaId             = _dataAreaId;

        List inventoryJournalList   = new List(Types::Class); 

        changecompany(dataAreaId)

        {

            List errorList = new List(Types::String);

            try

            {

                ttsbegin;

                WorkflowWorkItemTable    workItemTable;

                WorkflowWorkItemTable    WorkflowWorkItemTable;

                WorkflowVersionTable     workflowVersionTable;

                journalTable = InventJournalTable::find(journalId);             

                if(!journalTable)

                {

                    error = strFmt("JournalId is Invalid");


                    errorList.addEnd(error);

                }

                if (journalTable.WorkflowApprovalStatus == InventJournalWorkflowApprovalStatus::PendingApproval)

                {

                    error = strFmt("You cannot submit the workflow because it is already inReveiw");


                    errorList.addEnd(error);

                }

                if (journalTable.WorkflowApprovalStatus == InventJournalWorkflowApprovalStatus::Approved)

                {

                    error = strFmt("You cannot submit the workflow because it is already approved.");

                    errorList.addEnd(error);

                }

                if (journalTable.WorkflowApprovalStatus == InventJournalWorkflowApprovalStatus::NotSubmitted)

                {

                    Workflow::activateFromWorkflowType(workFlowTypeStr(InventJournalMovementTemplate), journalTable.RecId,

                                    'Workflow submimission', false, Curuserid());

                    message = 'Workflow has been submitted';

                }

                ttscommit;

            }

            catch(Exception::Error)

            {

                infoLogEnum   = SysInfoLogEnumerator::newData(infolog.infologData());

                while(infoLogEnum.moveNext())

                {

                    infoMessageStruct      = SysInfologMessageStruct::construct(infoLogEnum.currentMessage());

                    str integrationMessage = infoMessageStruct.message();

                    errorList.addEnd(integrationMessage);

                }

                ttsabort;

            }

            BASMSInventoryMovementResponseContract inventoryMovementData = new BASMSInventoryMovementResponseContract();

            inventoryMovementData = BASMSInventoryMovementResponseContract::newFromTableRecord(message,errorList);

            inventoryJournalList.addEnd(inventoryMovementData);

        }

        return inventoryJournalList;

    }


    // approve workflow helper

    [AifCollectionTypeAttribute('return', Types::Class, classStr(BASMSInventoryMovementResponseContract))]

    public List approveWorkflowDetails(str _journalId , str _dataAreaId)

    {

        InventJournalTable         journalTable;

        str                        error,message;

        str  journalId              = _journalId;

        str  dataAreaId             = _dataAreaId;

        List inventoryJournalList   = new List(Types::Class);  

        changecompany(dataAreaId)

        {

            List errorList = new List(Types::String);

            try

            {

                ttsbegin;

                WorkflowWorkItemTable    WorkflowWorkItemTable;

                WorkflowVersionTable     workflowVersionTable;

                journalTable = InventJournalTable::find(journalId);              

                if(!journalTable)

                {

                    error = strFmt("JournalId is Invalid");

                    errorList.addEnd(error);

                }

                if (journalTable.WorkflowApprovalStatus == InventJournalWorkflowApprovalStatus::NotSubmitted)

                {

                    error = strFmt("You cannot approve the workflow before you submit the workflow.");

                    errorList.addEnd(error);

                }

                if (journalTable.WorkflowApprovalStatus == InventJournalWorkflowApprovalStatus::Approved)

                {

                    error = strFmt("You cannot approve the workflow because it is already approved.");

                    errorList.addEnd(error);

                }

                if (journalTable.WorkflowApprovalStatus == InventJournalWorkflowApprovalStatus::PendingApproval)

                {

                    select firstonly WorkflowWorkItemTable

                     where workflowWorkItemTable.Type == WorkflowWorkItemType::WorkItem

                      && workflowWorkItemTable.Status == WorkflowWorkItemStatus::Pending // this should be Pending

                      && WorkflowWorkItemTable.RefTableId == tableNum(InventJournalTable)

                      && WorkflowWorkItemTable.RefRecId  == journalTable.RecId;

                    if (WorkflowWorkItemTable)

                    {                        WorkflowWorkItemActionManager::dispatchWorkItemAction(WorkflowWorkItemTable,

                            "Approve Workflow",

                            curuserId(),

                                                        WorkflowWorkItemActionType::Complete,

                            menuItemDisplayStr(InventJournalTableWorkflowDropDialog));

                        message = 'Workflow has been submitted for approval';

                    }          

                }

                ttscommit;

            }

            catch(Exception::Error)

            {

                infoLogEnum   = SysInfoLogEnumerator::newData(infolog.infologData());

                while(infoLogEnum.moveNext())

                {

                    infoMessageStruct      = SysInfologMessageStruct::construct(infoLogEnum.currentMessage());

                    str integrationMessage = infoMessageStruct.message();

                    errorList.addEnd(integrationMessage);

                }

                ttsabort;

            }


            BASMSInventoryMovementResponseContract inventoryMovementData = new BASMSInventoryMovementResponseContract();

            inventoryMovementData = BASMSInventoryMovementResponseContract::newFromTableRecord(message,errorList);

            inventoryJournalList.addEnd(inventoryMovementData);

        }

        return inventoryJournalList;


    }


}


Service Class :

class BASMSInventoryMovementService

{

// submit workflow service

    [AifCollectionTypeAttribute('return', Types::Class, classStr(BASMSInventoryMovementResponseContract))]


    public List submitWorkflow(BASMSInventoryMovementRequestContract _contract)

    {


        BASMSInventoryMovementHelper workLineDetails = new BASMSInventoryMovementHelper();


        str             journalId         = _contract.parmjournalId();

        str             dataAreaId        = _contract.parmdataAreaId();

        List            workOrderList     = new List(Types::Class);

        workOrderList = workLineDetails.submitWorkflowDetails(journalId,dataAreaId);

        return workOrderList;


    }


// approve workflow service

    [AifCollectionTypeAttribute('return', Types::Class, classStr(BASMSInventoryMovementResponseContract))]

    public List approveWorkflow(BASMSInventoryMovementRequestContract _contract)

    {

        BASMSInventoryMovementHelper workLineDetails = new BASMSInventoryMovementHelper();

        str             journalId         = _contract.parmjournalId();

        str             dataAreaId        = _contract.parmdataAreaId();

        List            workOrderList     = new List(Types::Class);

        workOrderList = workLineDetails.approveWorkflowDetails(journalId,dataAreaId);

        return workOrderList;


    }


}



Comments

Popular posts from this blog

how to post trade agreement journals automatically using x++ code

How to Create a wizard in x++ d365

x++ code to submit and approve and reject the invent movement workflow in d365 F&O