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
Post a Comment