Step1: Create approval status (Enum type)
Step2: Add into respective Table 
Step3: Add this table into respective workflow Form
            OR Sync the Form datasource if existing table
Step4: Override the “CanSubmitToWorkflow”  method in table 
Table Level:
public boolean
canSubmitToWorkflow(str
_workflowType = '')
{
    boolean
ret;
    
    if
(!this.ApprovalStatus == ApprovalStatus::NotSubmitted)
    return
false;
    else
    return
true;
  
}
Step 5: Create AOT query
Step 6: Create Workflow category and select the module which is
required for workflow
Step 7: Create Workflow type through wizard
WorkFlow Type Classes:
Workflow Submit
method:
public static
void main(Args args)
{
    // Variable
declaration.
    recId recId = args.record().RecId;
    WorkflowCorrelationId
workflowCorrelationId;
    // Hardcoded
type name
    WorkflowTypeName workflowTypeName =workflowtypestr(RecruitmentProj);
    // Initial
note is the information that users enter when they
    // submit the
document for workflow.
    WorkflowComment note ="";
    WorkflowSubmitDialog workflowSubmitDialog;
    HRMRecruitingTable  hrmRecruitingTable;
    // Opens the
submit to workflow dialog.
    workflowSubmitDialog =
   
WorkflowSubmitDialog::construct(args.caller().getActiveWorkflowConfiguration());
    workflowSubmitDialog.run();
    if
(workflowSubmitDialog.parmIsClosedOK())
    {
        recId = args.record().RecId;
        hrmRecruitingTable = args.record();
        // Get
comments from the submit to workflow dialog.
        note =
workflowSubmitDialog.parmWorkflowComment();
        try
        {
            ttsbegin;
            workflowCorrelationId
=Workflow::activateFromWorkflowType(workflowTypeName,recId,note,NoYes::No);
            hrmRecruitingTable.ApprovalStatus =
ApprovalStatus::Submitted;
            //
Send an Infolog message.
            info("Submitted
to workflow.");
            ttscommit;
        }
        catch(exception::Error)
        {
            info("Error
on workflow activation.");
        }
    }
    args.caller().updateWorkFlowControls();
}
Approved event
handler:
public void
completed(WorkflowEventArgs _workflowEventArgs)
{
    HRMRecruitingTable hrmrecruitingTable;
    select
forupdate hrmrecruitingTable where hrmrecruitingTable.RecId ==
_workflowEventArgs.parmWorkflowContext().parmRecId();
    if(hrmrecruitingTable.RecId)
    {
        hrmrecruitingTable.ApprovalStatus =
ApprovalStatus::Approved;
        hrmrecruitingTable.update();
    }
}
Step 8: Create
Workflow Approval through wizard:
Approval Classes:
Resubmit :
public static
void main(Args args)
{
    // Variable
declaration.
    recId recId = args.record().RecId;
    WorkflowCorrelationId
_workflowCorrelationId;
    // Hardcoded
type name
    WorkflowTypeName _workflowTypeName = workflowtypestr(RecruitmentProj);
    // Initial
note is the information that users enter when they
    // submit the
document for workflow.
    WorkflowComment _initialNote ="";
    WorkflowWorkItemActionDialog
    WorkflowWorkItemActionDialog;
    HRMRecruitingTable  hrmRecruitingTable;
    ;
    // Opens the
submit to workflow dialog.
    workflowWorkItemActionDialog =
WorkflowWorkItemActionDialog::construct(args.caller().getActiveWorkflowWorkItem(),
                                                                           
WorkflowWorkItemActionType::Resubmit,
                                                                           
new MenuFunction(menuitemactionstr(RecruitmentProjApprResubmitMenuItem),
                                                                           
MenuItemType::Action));
    workflowWorkItemActionDialog.run();
    if
(WorkflowWorkItemActionDialog.parmIsClosedOK())
    {
        recId = args.record().RecId;
        hrmRecruitingTable = args.record();
        // Get
comments from the submit to workflow dialog.
        _initialNote =
workflowWorkItemActionDialog.parmWorkflowComment();
        try
        {
            ttsbegin;
           
WorkflowWorkItemActionManager::dispatchWorkItemAction(args.caller().getActiveWorkflowWorkItem(),
                                                                   
_initialNote,
                                                                    curUserId(),
                                                                   
WorkflowWorkItemActionType::Resubmit,
                                                                   
args.menuItemName(),
                                                                    false);
            hrmRecruitingTable.ApprovalStatus =
ApprovalStatus::Submitted;
            //
Send an Infolog message.
            info("Resubmitted
to workflow.");
            ttscommit;
        }
        catch(exception::Error)
        {
        info("Error
on workflow activation.");
        }
    }
    args.caller().updateWorkFlowControls();
}
Returned (Rejected)
Logic:
public void
returned(WorkflowElementEventArgs _workflowElementEventArgs)
{
    HRMRecruitingTable hrmrecruitingTable;
    select
forupdate hrmrecruitingTable where hrmrecruitingTable.RecId ==
_workflowElementEventArgs.parmWorkflowContext().parmRecId();
    if(hrmrecruitingTable.RecId)
    {
        hrmrecruitingTable.ApprovalStatus =
ApprovalStatus::Rejected;
        hrmrecruitingTable.update();
    }
}
Step 9: Drag And Drop workflow approval element from
workflow approvals in to supported elements under workflow type
Step 10: Apply this workflow to our form by going to design
properties
Workflow enabled: Yes
Worflow Datasource: 
Workflow Type:
Step 11:
Create New Menu item (Check the document).
Step 12:
Configuring Workflow