Multilevel Workflow for Sales order change
[VA02]
For this type of workflow first we have to
find out maximum level for the approval.
For this we have to create activity.
Here we have to mention
class name and its method as well as if it required then you to create some
variable at container tab for import or export parameter.
Above binding is inside the task now below
binding is outside the task.
Class method for finding maximum level for
approver.
Method
for get maximum level of approver
METHOD get_maxlevel.
DATA:ls_max_level TYPE zwf_dyn_vbak-zalevel.
DATA:lv_inita TYPE uname.
lv_inita = wfinitiator+2(12).
IF zterm = 'X'.
SELECT MAX( zalevel )
FROM zwf_dyn_vbak
INTO ls_max_level
WHERE approveby = lv_inita AND field_name = 'ZTERM'.
max_level = ls_max_level.
ENDIF.
IF kvgr2 = 'X'.
SELECT MAX( zalevel )
FROM zwf_dyn_vbak
INTO ls_max_level
WHERE approveby = lv_inita AND field_name = 'AVGR2'.
max_level = ls_max_level.
ENDIF.
ENDMETHOD.
DATA:ls_max_level TYPE zwf_dyn_vbak-zalevel.
DATA:lv_inita TYPE uname.
lv_inita = wfinitiator+2(12).
IF zterm = 'X'.
SELECT MAX( zalevel )
FROM zwf_dyn_vbak
INTO ls_max_level
WHERE approveby = lv_inita AND field_name = 'ZTERM'.
max_level = ls_max_level.
ENDIF.
IF kvgr2 = 'X'.
SELECT MAX( zalevel )
FROM zwf_dyn_vbak
INTO ls_max_level
WHERE approveby = lv_inita AND field_name = 'AVGR2'.
max_level = ls_max_level.
ENDIF.
ENDMETHOD.
Next activity is we have to generate loop
step in workflow.
After getting maximum level for approver next
we have to create an instance for generate link for sales order in email. Below
screen for instance binding inside the task.
Next screen is outside binding after task is
created.
Now in loop we have to increment the counter
using custom container.
Code
for Email ID with Approver level:
METHOD get_emailid.
DATA: is_wf_vbak TYPE zwf_dyn_vbak,
is_addsmtp TYPE bapiadsmtp.
DATA : lv_inita TYPE uname,
lv_add TYPE bapiaddr3.
DATA : return TYPE bapiret2.
lv_inita = wfinitiator+2(12).
IF zterm = 'X'.
SELECT SINGLE *
FROM zwf_dyn_vbak
INTO is_wf_vbak
WHERE approveby = lv_inita AND zalevel = apprv_level AND field_name = 'ZTERM'.
IF sy-subrc = 0.
email_app = is_wf_vbak-a_emailid.
email_init = is_wf_vbak-i_emailid.
ENDIF.
ENDIF.
IF kvgr2 = 'X'.
SELECT SINGLE *
FROM zwf_dyn_vbak
INTO is_wf_vbak
WHERE approveby = lv_inita AND zalevel = apprv_level AND field_name = 'AVGR2'.
IF sy-subrc = 0.
email_app = is_wf_vbak-a_emailid.
email_init = is_wf_vbak-i_emailid.
ENDIF.
ENDIF.
ENDMETHOD.
DATA: is_wf_vbak TYPE zwf_dyn_vbak,
is_addsmtp TYPE bapiadsmtp.
DATA : lv_inita TYPE uname,
lv_add TYPE bapiaddr3.
DATA : return TYPE bapiret2.
lv_inita = wfinitiator+2(12).
IF zterm = 'X'.
SELECT SINGLE *
FROM zwf_dyn_vbak
INTO is_wf_vbak
WHERE approveby = lv_inita AND zalevel = apprv_level AND field_name = 'ZTERM'.
IF sy-subrc = 0.
email_app = is_wf_vbak-a_emailid.
email_init = is_wf_vbak-i_emailid.
ENDIF.
ENDIF.
IF kvgr2 = 'X'.
SELECT SINGLE *
FROM zwf_dyn_vbak
INTO is_wf_vbak
WHERE approveby = lv_inita AND zalevel = apprv_level AND field_name = 'AVGR2'.
IF sy-subrc = 0.
email_app = is_wf_vbak-a_emailid.
email_init = is_wf_vbak-i_emailid.
ENDIF.
ENDIF.
ENDMETHOD.
Now next activity is user decision for
whether user has approve or not sales order.
In this user decision we have to create rule.
After this we have to set flag whether it is approved or reject. If user has
reject the sales order then we have to set loop level with max level.
Next screen for set flag for
approve.
Below screen is for set flag for rejection.
After Reject flag set then set the loop level
and max level same.
After the approve or reject process we have
to check the flag if it is approve or reject.
Binding for approve sales order.
Code for set billing block as well as for
approve and reject sales order.
method SET_BILLING_BLOCK.
DATA:ls_tvfst TYPE tvfst.
IF zterm = 'X'.
SELECT SINGLE faksp vtext
FROM tvfst
INTO CORRESPONDING FIELDS OF ls_tvfst
WHERE faksp = '41' AND spras = 'EN'.
UPDATE vbak
SET faksk = ls_tvfst-faksp
WHERE vbeln = vbeln.
ENDIF.
IF kvgr2 = 'X'.
SELECT SINGLE faksp vtext
FROM tvfst
INTO CORRESPONDING FIELDS OF ls_tvfst
WHERE faksp = '41' AND spras = 'EN'.
UPDATE vbak
SET faksk = ls_tvfst-faksp
WHERE vbeln = vbeln.
ENDIF.
endmethod.
Method for
approve sales order
method APPROVE_SALES_ORDER.
IF zterm = 'X'.
UPDATE vbak
SET zzterm1 = ' '
where vbeln = vbeln.
ENDIF.
IF kvgr2 = 'X'.
UPDATE vbak
SET zzkvgr2 = ' '
where vbeln = vbeln.
ENDIF.
endmethod.
IF zterm = 'X'.
UPDATE vbak
SET zzterm1 = ' '
where vbeln = vbeln.
ENDIF.
IF kvgr2 = 'X'.
UPDATE vbak
SET zzkvgr2 = ' '
where vbeln = vbeln.
ENDIF.
endmethod.
Method for Reject sales order with attachment
file for reject reason.
METHOD reject_sales_order.
IF zterm = 'X' OR kvgr2 = 'X'.
DATA : lv_docid TYPE so_entryid,
lv_docid_tmp TYPE char90,
lt_attach TYPE STANDARD TABLE OF swr_object.
DATA : ls_attach TYPE swr_object.
DATA : flag TYPE flag.
FIELD-SYMBOLS : <ls_rejtext> TYPE solisti1.
CALL FUNCTION 'SAP_WAPI_GET_ATTACHMENTS'
EXPORTING
workitem_id = im_wiid
TABLES
attachments = lt_attach.
IF NOT lt_attach[] IS INITIAL.
READ TABLE lt_attach INTO ls_attach INDEX 1.
IF sy-subrc EQ 0.
REPLACE ALL OCCURRENCES OF 'SOFM' IN ls_attach-object_id WITH space.
SHIFT ls_attach-object_id LEFT DELETING LEADING space.
* CONDENSE LV_DOCID NO-GAPS.
lv_docid_tmp = ls_attach-object_id.
* CONDENSE LV_DOCID_TMP NO-GAPS.
lv_docid = lv_docid_tmp.
ENDIF.
ENDIF.
***FM to get content text for Dicument key
CALL FUNCTION 'SO_DOCUMENT_READ_API1'
EXPORTING
document_id = lv_docid
TABLES
object_content = text
EXCEPTIONS
document_id_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
DELETE text WHERE line+0(3) = '000'.
LOOP AT text ASSIGNING <ls_rejtext>.
<ls_rejtext>+0(3) = ' '.
ENDLOOP.
ENDIF.
ENDIF.
ENDMETHOD.
IF zterm = 'X' OR kvgr2 = 'X'.
DATA : lv_docid TYPE so_entryid,
lv_docid_tmp TYPE char90,
lt_attach TYPE STANDARD TABLE OF swr_object.
DATA : ls_attach TYPE swr_object.
DATA : flag TYPE flag.
FIELD-SYMBOLS : <ls_rejtext> TYPE solisti1.
CALL FUNCTION 'SAP_WAPI_GET_ATTACHMENTS'
EXPORTING
workitem_id = im_wiid
TABLES
attachments = lt_attach.
IF NOT lt_attach[] IS INITIAL.
READ TABLE lt_attach INTO ls_attach INDEX 1.
IF sy-subrc EQ 0.
REPLACE ALL OCCURRENCES OF 'SOFM' IN ls_attach-object_id WITH space.
SHIFT ls_attach-object_id LEFT DELETING LEADING space.
* CONDENSE LV_DOCID NO-GAPS.
lv_docid_tmp = ls_attach-object_id.
* CONDENSE LV_DOCID_TMP NO-GAPS.
lv_docid = lv_docid_tmp.
ENDIF.
ENDIF.
***FM to get content text for Dicument key
CALL FUNCTION 'SO_DOCUMENT_READ_API1'
EXPORTING
document_id = lv_docid
TABLES
object_content = text
EXCEPTIONS
document_id_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
DELETE text WHERE line+0(3) = '000'.
LOOP AT text ASSIGNING <ls_rejtext>.
<ls_rejtext>+0(3) = ' '.
ENDLOOP.
ENDIF.
ENDIF.
ENDMETHOD.
After approve from all level
we have to remove the billing block.
method UPDATE_VBAK.
DATA:ls_vbak TYPE vbak.
SELECT SINGLE *
FROM vbak
INTO ls_vbak
WHERE vbeln = vbeln.
IF ls_vbak-zzterm1 = ' ' and ls_vbak-zzkvgr2 = ' '.
UPDATE vbak
SET faksk = ' '
where vbeln = vbeln.
ENDIF.
endmethod.
DATA:ls_vbak TYPE vbak.
SELECT SINGLE *
FROM vbak
INTO ls_vbak
WHERE vbeln = vbeln.
IF ls_vbak-zzterm1 = ' ' and ls_vbak-zzkvgr2 = ' '.
UPDATE vbak
SET faksk = ' '
where vbeln = vbeln.
ENDIF.
endmethod.