Homelab, Linux, JS & ABAP (~˘▾˘)~
 

[Fiori] Send notification mail if workitem is forwarded in MyInbox

Workitem function modules

If you forward a workitem manually from the MyInbox or via function module SAP_WAPI_FORWARD_WORKITEM, the function module SWW_WI_FORWARD will be called. There the SAP implemented a BAdI call of the BAdI WF_WI_FORWARD.

BAdI WF_WI_FORWARD

The BAdI provides a method to add additional checks, when forwarding a workitem. I will use it, to send notification mails.

BAdI Filter

Create your own BAdI implementation and add a task id as filter. In my case it’s the task TS21500003 of the leave request approval workflow.
Now your implementation will only be called, if this specific workitem is forwarded. Now we implement the method CHECK_BEFORE_FORWARD. The method has enough parameters to get all necessary information to enrich the mail text.

IF_EX_WF_WI_WORKITEM~CHECK_BEFORE_FORWARD Paramter

First the workitem container is read out of the context. There we get the _WI_OBJECT_ID element, which contains the request object reference. With this information we are able to get the current request object out of the workflow. I pass this into antother class where I already have a mail sending implementation.

  METHOD if_ex_wf_wi_workitem~check_before_forward.
*---------------------------------------------------------------------------------*
* This BAdI implementation is used to send an info mail when a workitem is forwarded.
*---------------------------------------------------------------------------------*

    TRY.

        "Get workitem container and requestId
        DATA(container) = im_workitem_context->get_wi_container( ).

        container->get_value_ref( EXPORTING name       = |_WI_OBJECT_ID|
                                  IMPORTING value_ref  = DATA(lr_req_id) ).

        ASSIGN lr_req_id->* TO FIELD-SYMBOL(<lpor>).

        "Get current request object
        DATA(lo_req) = NEW cl_pt_req_wf_attribs( )->bi_persistent~find_by_lpor( lpor = <lpor> ).

        "Send an info mail to each new agent (should be only one)
        LOOP AT im_table_new_agents INTO DATA(new_agent).
          zcl_hcm_leave_request_assist=>send_mail( io_req         = CAST cl_pt_req_wf_attribs( lo_req )
                                                   iv_tdname      = mc_mailtext
                                                   iv_pernr       = cl_hcmfab_employee_api=>get_instance( )->get_employeenumber_from_user( iv_user = new_agent-objid ) ).
        ENDLOOP.


      CATCH cx_hcmfab_common.
      CATCH cx_swf_cnt_elem_not_found.
      CATCH cx_swf_cnt_container.
        "In error case, do nothing. The workitem should still be forwarded.
        RETURN.
    ENDTRY.

    "Write Info to WF Log
    MESSAGE s001(00) WITH |Forward: Mail { mc_mailtext }| INTO DATA(lv_message).
    im_workitem_context->set_message_to_log( im_function = CONV #( lv_message )         "max char30
                                             im_message = VALUE #( msgid = sy-msgid
                                                                   msgty = sy-msgty
                                                                   msgno = sy-msgno
                                                                   msgv1 = sy-msgv1 ) ).
    COMMIT WORK.
  ENDMETHOD.

At the end I’m writing a little notification in the workflow log. The workitem context provides the method set_message_to_log for this. The log will look like this.

4 Comments

  1. Mike

    Hy, is there any possibility to read the comment which can be entered when you forward a workiten in MYINBOX?

    Actually i am able to read all comments, but only those who already have been saved, which is not the case for the one entered while forwarding.

    Do you have any tipps here?

    1. nocin

      Hi Mike,

      du scheinst ebenfalls deutschsprachig, daher antworte ich mal auf deutsch. 🙂

      Habe leider auf das System keinen Zugriff mehr, wo ich das entwickelt hatte, bin aber mal bei der Zeiterfassungsapp auf ein ähnliches Problem gestoßen mit den Action-Kommentaren.
      Die Action-Kommentare werden erst bei einer neuen Antragsversion in die Antragsdatenbank geschrieben, daher musste man die aus dem Workitem lesen.
      Weiß leider nicht mehr genau wie und wo. Möglicherweise mit:

      read table it_wf_container_tab with key element = ‘ACTION_COMMENTS’ into ls_wf_container.

      Und möglicherweise hier:

      CL_HCMFAB_IM_LEAVE_APPROVAL
      /IWWRK/IF_WF_WI_BEFORE_UPD_IB~BEFORE_UPDATE

      Aber eigentlich hat man in CHECK_BEFORE_FORWARD ja auch das Workitem an der Hand und der Kommentar müsste zu finden sein im Container?!

      Damals hatte mir die Klasse CL_PT_REQ_REQEST geholfen (gibt es analog ja auch für den Abwesenheitsprozess).
      In der Tabelle: ME-> STATE_TRANSITIONS_TAB kann man herauslesen, wann eine neue Antragsversion geschrieben wird.
      Geschrieben wird die Version dann in der Methode CLONE_TO_NEW (Ausschau halten nach lcl_attribs_curr_notice).

      Das ist leider alles was ich in meinen Notizen dazu finden kann. Und wie gesagt, kann ich nicht nochmal nachschauen, was ich im Detail gemacht hatte.
      Schreib mir gerne, ob du weiterkommst. Am liebsten würde ich mir das selber nochmal am System anschauen. 🙂

      Viele Grüße
      Nico

  2. Mike

    Hallo, danke für deine Antwort.
    Das ursprüngliche Problem ist, dass der Kommentar dem BADI nicht übergeben wird.
    Mittels deiner angegeben Lösungsmöglichkeiten lassen sich die Kommentare zwar auslesen, aber nicht der aktuelle der im Popup eingegeben wird.
    Ich lese die Kommentare mit der Klasse /iwpgw/cl_tgw_task_facade_bwf aus.
    Aber wie gesagt, zum Zeitpunkt der Ausführung des BADIS findet man den Kommentar noch nicht.

    Wie hab ich es nun gelöst? Ich rufe im BADI einen Fuba per remote im Hintergrund auf, und tada, dann wurde der Kommentar in der Zwischenzeit gespeichert, und ich kann ihn auslesen =)

  3. nocin

    Moin Mike,

    top!
    Irgendwie trotzdem unschön, dass man überhaupt so einen Weg gehen muss, aber ich konnte damals auch nicht herausfinden, wo und wie diesen Kommentare in der Zwischenzeit gehalten werden. Auf deinen Weg mit dem Fuba wäre ich auf jeden Fall im Leben nicht gekommen. 😉

    beste Grüße
    Nico

Leave a Reply

Your email address will not be published. Required fields are marked *