Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- METHOD if_swf_flex_ifs_condition_eval~evaluate_condition.
- *&**********************************************************************
- *OBJECT ID : ZCL_MM_SWF_WF_COND_EVAL *
- *TITLE : Purchase Order Pre-Condition check *
- *AUTHOR : Shiva Krishna *
- *DATE : 17/02/2021 *
- *DEVELOPMENT ID : W-PR-0001 *
- *Rev-Trac : 326,129,918 *
- *REQUESTED BY : Rachel McCutcheon *
- *TRANSPORT NO. : SD1K904020,SD1K904127,SD1K905223,SD1K905376 *
- * SD1K905390,SD1K905461,SD1K905543,SD1K905550 *
- *DESCRIPTION : Purchase Order Pre-Condition check *
- * To check the preconditions for the workflow to get trigger *
- *&**********************************************************************
- *& CHANGE HISTORY LOG *
- *&---------------------------------------------------------------------*
- * DATE(MM/DD/YYYY)| DEVELOPER | REQUESTOR | TRANSPORT # *
- * 07/29/2021 | Shiva Krishna | Eswar | TR# SD1K906194 *
- * SD1K906232 *
- * SD1K906248 *
- * SD1K906254 *
- * DESCRIPTION : Added new logic to determine the PR workflow agents *
- *11/17/2021 | Venkatesh | Eswar I TR #SD1K907675 *
- * SD1K907863 *
- * DESCRIPTION : Added new logic for procurement manager *
- *12/02/2021 | Venkatesh | Eswar I TR #SD1K907936 *
- * RT #1505 *
- * DESCRIPTION : Added new approval step for cost center owner for PO *
- *01/25/2022 | Hoda Jebari | Venkat Chirumamella | TR #SD1K908555*
- * RT #1731 *
- * DESCRIPTION : Fixing dump in PO workflow net price calculation *
- *02/04/2022 | Shiva Krishna | Eswar | TR #SD1K908725 *
- * DESCRIPTION : Added for the LT dump *
- *03/07/2022 | Karim Ait Alla | Hamza Asrar | TR #SD1K909104 *
- * SD1K909115 *
- * DESCRIPTION : Added for checking PR N° & PR item are numeric *
- *&---------------------------------------------------------------------&
- * 01/10/2023 | Ahmed Ait Lahcen | Hamza Asrar | TR# SD1K911104 *
- * DESCRIPTION : Suppress WF approval for some contract change scenarios*
- *&---------------------------------------------------------------------&
- * 02/20/2023 | Ahmed Ait Lahcen | Hamza Asrar | TR# SD1K911356 *
- * DESCRIPTION : Suppress WF approval for PO / Contract *
- *&---------------------------------------------------------------------&
- * 05/09/2023 | Ahmed Ait Lahcen | Hamza Asrar | TR# SD1K911783 *
- * DESCRIPTION : INC1804574: Adding Price Unit to total PR value for *
- * PR approvals *
- *&---------------------------------------------------------------------&
- *&--- Read the condition values for the Paramater
- *&--- When the condition is satisifed workflow will get trigger
- *&--- Local Type Declarations
- TYPES : BEGIN OF ty_jobcode,
- zzjob_code TYPE pa0001-zzjob_code,
- END OF ty_jobcode,
- ty_bsart TYPE RANGE OF bsart. "Added for RT# 2781 TR SD1K911104
- *&--- Local Variable Declarations
- DATA : lt_jobcode TYPE TABLE OF ty_jobcode,
- lr_jobcode TYPE RANGE OF zzjob_code,
- ls_job LIKE LINE OF lr_jobcode,
- lv_plans TYPE pa0001-plans,
- lv_sobid TYPE hrp1001-sobid,
- lv_level TYPE char1,
- lv_htype_1 TYPE datatype_d, "Added for RT# 1968 TR SD1K909115
- lv_htype_2 TYPE datatype_d, "Added for RT# 1968 TR SD1K909115
- lv_old_po_value TYPE effwr, "Added for RT# 2876 TR SD1K911356
- lv_new_po_value TYPE effwr, "Added for RT# 2876 TR SD1K911356
- *&--- Begin of code for RT# 2781 TR# SD1K911104
- lo_ref_ca_sfly_utilities TYPE REF TO zcl_ca_sfly_utilities,
- lt_tvarvc2 TYPE zcl_ca_sfly_utilities=>tt_tvarvc,
- lr_value_bsart TYPE ty_bsart,
- lr_qty_bsart TYPE ty_bsart.
- *&--- End of code for RT# 2781 TR# SD1K911104
- CONSTANTS: lc_s TYPE rsscr_kind VALUE 'S',
- *&--- Begin of code for RT# 2781 TR# SD1K911104
- lc_zmm_wf_contracts TYPE tabname VALUE 'ZMM_WF_CONTRACTS',
- lc_value_contract TYPE rvari_vnam VALUE 'ZMM_CON_VALUE',
- lc_qty_contract TYPE rvari_vnam VALUE 'ZMM_CON_QTY'.
- *&--- End of code for RT# 2781 TR# SD1K911104
- *&---- Begin of code for RT#1731 TR#SD1K908555
- DATA lv_netwr TYPE ktwrt.
- *&---- End of code for RT#1731 TR#SD1K908555
- *&--- Default Not trigger level or workflow
- cv_is_true = abap_false.
- IF is_sap_object_node_type-sont_key_part_1 IS NOT INITIAL.
- *&--- Validate for Purchase Order and Contracts
- CASE is_sap_object_node_type-sont.
- WHEN 'PurchaseOrder' OR 'PurchaseContract'.
- *&--- Get the PO Header Details
- SELECT SINGLE ebeln,
- bukrs,
- bstyp,
- bsart,
- ernam,
- waers,
- ktwrt
- FROM ekko
- INTO @DATA(ls_ekko)
- WHERE ebeln = @is_sap_object_node_type-sont_key_part_1.
- *&--- Get the PO Item Details
- SELECT ebeln,
- ebelp,
- netwr,
- konnr,
- zwert FROM ekpo
- INTO TABLE @DATA(lt_ekpo)
- WHERE ebeln = @is_sap_object_node_type-sont_key_part_1.
- *&--- Validate for the Contract Reference
- IF line_exists( it_parameter_value[ name = 'EKPO-KONNR' ] ).
- LOOP AT lt_ekpo ASSIGNING FIELD-SYMBOL(<fs_ekpo>).
- IF <fs_ekpo>-konnr IS NOT INITIAL.
- cv_is_true = abap_false. "Not to trigger the workflow
- EXIT.
- ELSE.
- cv_is_true = abap_true. "To trigger the workflow
- ENDIF.
- ENDLOOP.
- ENDIF.
- DATA(lv_condition_id) = is_condition-condition_id.
- CONDENSE lv_condition_id NO-GAPS.
- DATA(lv_execution) = is_condition-execution_context.
- CONDENSE lv_execution NO-GAPS.
- *&--- Trigger Workflow whenever
- *&--- Total net value of all line items in Quantity Contract greater than
- IF is_sap_object_node_type-sont = 'PurchaseContract'.
- IF lv_condition_id = '3' AND
- lv_execution = 'start'.
- IF line_exists( it_parameter_value[ name = 'EKPO-ZWERT' ] ).
- *&---- Begin of commented code for RT#1731 TR#SD1K908555
- * DATA(lv_netwr) = REDUCE ekpo-zwert( INIT x = 0 FOR ls_ekpo IN lt_ekpo
- * NEXT x = x + ls_ekpo-zwert ).
- *&---- End of commented code for RT#1731 TR#SD1K908555
- *&---- Begin of added code for RT#1731 TR#SD1K908555
- lv_netwr = REDUCE ekko-ktwrt( INIT x = VALUE ekko-ktwrt( ) FOR ls_ekpo IN lt_ekpo
- NEXT x = x + ls_ekpo-zwert ).
- *&---- End of added code for RT#1731 TR#SD1K908555
- DATA(ls_param) = it_parameter_value[ name = 'EKPO-ZWERT' ].
- DATA(ls_currency) = it_parameter_value[ name = 'Currency' ].
- IF lv_netwr GT ls_param-value AND
- ls_currency-value = ls_ekko-waers.
- cv_is_true = abap_true.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- *&--- Trigger Workflow whenever for Job Code at header
- IF lv_condition_id = '6' AND
- lv_execution = 'start'.
- IF line_exists( it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ] ).
- DATA(ls_param_value) = it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ].
- *&--- Get the Personal Number for the User ID
- SELECT SINGLE pernr
- FROM pa0105
- INTO @DATA(lv_pernr)
- WHERE subty = @gc_0001
- AND endda GE @sy-datum
- AND begda LE @sy-datum
- AND usrid = @ls_ekko-ernam.
- IF lv_pernr IS NOT INITIAL.
- *&--- Get the Org.unit and Position for the Personal Number
- *&--- When the Job code match with the input value, trigger workflow
- SELECT SINGLE pernr,
- werks,
- orgeh,
- plans,
- stell,
- mstbr,
- zzjob_code
- FROM pa0001
- INTO @DATA(ls_pa0001_po)
- WHERE pernr = @lv_pernr
- AND endda GE @sy-datum
- AND begda LE @sy-datum.
- IF ls_pa0001_po-zzjob_code = ls_param_value-value.
- cv_is_true = abap_true. "Trigger Workflow
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- *&--- Get the Condition value for workflow start/step
- lv_condition_id = is_condition-condition_id.
- CONDENSE lv_condition_id.
- lv_execution = is_condition-execution_context.
- CONDENSE lv_execution.
- *&--- Trigger Workflow whenever for Job Code at level
- *&--- Get the Netprice value
- IF lv_condition_id = '6' AND
- lv_execution = 'step'.
- IF line_exists( it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ] ).
- IF is_sap_object_node_type-sont = 'PurchaseOrder'.
- *&---- Begin of commented code for RT#1731 TR#SD1K908555
- * lv_netwr = REDUCE ekpo-netwr( INIT x = 0 FOR ls_ekpo IN lt_ekpo
- * NEXT x = x + ls_ekpo-netwr ).
- *&---- End of commented code for RT#1731 TR#SD1K908555
- *&---- Begin of added code for RT#1731 TR#SD1K908555
- lv_netwr = REDUCE ekko-ktwrt( INIT x = VALUE ekko-ktwrt( ) FOR ls_ekpo IN lt_ekpo
- NEXT x = x + ls_ekpo-netwr ).
- *&---- End of added code for RT#1731 TR#SD1K908555
- ELSEIF is_sap_object_node_type-sont = 'PurchaseContract'.
- IF ls_ekko-ktwrt IS NOT INITIAL.
- lv_netwr = ls_ekko-ktwrt.
- ELSE.
- *&---- Begin of commented code for RT#1731 TR#SD1K908555
- * lv_netwr = REDUCE ekpo-zwert( INIT x = 0 FOR ls_ekpo IN lt_ekpo
- * NEXT x = x + ls_ekpo-zwert ).
- *&---- End of commented code for RT#1731 TR#SD1K908555
- *&---- Begin of added code for RT#1731 TR#SD1K908555
- lv_netwr = REDUCE ekko-ktwrt( INIT x = VALUE ekko-ktwrt( ) FOR ls_ekpo IN lt_ekpo
- NEXT x = x + ls_ekpo-zwert ).
- *&---- End of added code for RT#1731 TR#SD1K908555
- ENDIF.
- ENDIF.
- *&--- Get the Personal Number for the User ID
- SELECT SINGLE pernr
- FROM pa0105
- INTO lv_pernr
- WHERE subty = gc_0001
- AND endda GE sy-datum
- AND begda LE sy-datum
- AND usrid = ls_ekko-ernam.
- *&--- Do to get the Manager for the Approval
- DO 10 TIMES.
- IF lv_pernr IS NOT INITIAL.
- *&--- Get the Org.unit and Position for the Personal Number
- SELECT SINGLE pernr
- werks
- orgeh
- plans
- stell
- mstbr
- zzjob_code
- FROM pa0001
- INTO ls_pa0001_po
- WHERE pernr = lv_pernr
- AND endda GE sy-datum
- AND begda LE sy-datum.
- IF sy-subrc NE 0.
- EXIT.
- ELSE.
- *&--- Get the job code for the Personal Number to match with the level
- DATA(lv_jobcode) = ls_pa0001_po-zzjob_code.
- APPEND lv_jobcode TO lt_jobcode.
- ls_param_value = it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ].
- IF ls_param_value-value = ls_pa0001_po-zzjob_code.
- *&--- Validate Job code in the table and approval limit with the netprice
- IF is_sap_object_node_type-sont = 'PurchaseOrder'.
- SELECT SINGLE * FROM zmm_wfagent_po INTO @DATA(ls_agent_po) WHERE zzjob_code = @ls_param_value-value.
- ELSE.
- SELECT SINGLE * FROM zmm_wfagent_con INTO ls_agent_po WHERE zzjob_code = ls_param_value-value.
- ENDIF.
- IF sy-subrc EQ 0.
- IF lv_netwr GT ls_agent_po-aprvl_limit.
- *&--- Fill the static variable for the Agent determination in the class ZCL_MM_PUR_WF_AGENT.
- zcl_mm_swf_wf_cond_eval=>gc_jobcode = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_netwr = lv_netwr.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- EXIT.
- ELSE.
- *&--- Whenever the Jobcode condition with custom table fails validate with the netprice.
- IF is_sap_object_node_type-sont = 'PurchaseOrder'.
- SELECT * FROM zmm_wfagent_po INTO TABLE @DATA(lt_agent_po) WHERE aprvl_limit GE @lv_netwr.
- ELSE.
- SELECT * FROM zmm_wfagent_con INTO TABLE lt_agent_po WHERE aprvl_limit GE lv_netwr.
- ENDIF.
- IF sy-subrc EQ 0.
- SORT lt_agent_po BY aprvl_limit.
- *&--- Always read the 1st record and validate it with the job code
- *&--- Fill the static variable for the Agent determination in the class ZCL_MM_PUR_WF_AGENT
- READ TABLE lt_agent_po INTO ls_agent_po INDEX 1.
- IF ls_param_value-value = ls_agent_po-zzjob_code.
- zcl_mm_swf_wf_cond_eval=>gc_jobcode = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_netwr = lv_netwr.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- EXIT.
- ELSE.
- *&--- If both the validation with the Job code and Approval limit fails
- *&--- Get the all the Job code for the creator and validate them
- *&--- Fill the static variable for the Agent determination in the class ZCL_MM_PUR_WF_AGENT
- LOOP AT lt_jobcode INTO DATA(ls_jobcode).
- ls_job-sign = 'I'.
- ls_job-option = 'EQ'.
- ls_job-low = ls_jobcode-zzjob_code.
- APPEND ls_job TO lr_jobcode.
- CLEAR : ls_job.
- ENDLOOP.
- DELETE lt_agent_po WHERE zzjob_code NOT IN lr_jobcode.
- SORT lt_agent_po BY aprvl_limit.
- READ TABLE lt_agent_po INTO ls_agent_po INDEX 1.
- IF ls_param_value-value = ls_agent_po-zzjob_code.
- zcl_mm_swf_wf_cond_eval=>gc_jobcode = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_netwr = lv_netwr.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- IF ls_pa0001_po-mstbr IS NOT INITIAL.
- lv_pernr = ls_pa0001_po-mstbr.
- ELSE.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDDO.
- ENDIF.
- ENDIF.
- CLEAR : lt_jobcode.
- *&--- Begin of changes RT #1505 TR#SD1K907936
- *&---cost center owner
- IF lv_condition_id = '7' AND
- lv_execution = 'step'.
- *&--- Get the condition id details for the PO cost center owner
- IF line_exists( it_parameter_value[ name = 'M/O' ] ).
- ls_param_value = it_parameter_value[ name = 'M/O' ].
- CASE ls_param_value-value.
- WHEN 'O'.
- SELECT * FROM tvarvc INTO TABLE @DATA(lt_tvarvc) WHERE name = @gc_lt_workflow_po
- AND type = @lc_s .
- IF sy-subrc IS INITIAL.
- DATA(lv_tvarvc) = VALUE #( lt_tvarvc[ low = ls_ekko-bsart ]-high OPTIONAL ).
- ENDIF.
- IF lv_tvarvc = 3.
- SELECT SINGLE aufnr INTO @DATA(lv_aufnr) FROM ekkn WHERE ebeln = @ls_ekko-ebeln.
- IF sy-subrc IS INITIAL.
- SELECT SINGLE kostv FROM aufk INTO @DATA(lv_kostv) WHERE aufnr = @lv_aufnr.
- IF sy-subrc IS INITIAL.
- SELECT SINGLE verak_user FROM csks INTO @DATA(lv_user) WHERE kostl = @lv_kostv.
- IF sy-subrc IS INITIAL.
- SELECT SINGLE pernr FROM pa0105 INTO lv_pernr WHERE usrid = lv_user
- AND begda LE sy-datum
- AND endda GE sy-datum.
- IF sy-subrc IS INITIAL.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- ELSEIF lv_tvarvc = 2.
- SELECT SINGLE kostl INTO @DATA(lv_ccenter) FROM ekkn WHERE ebeln = @ls_ekko-ebeln.
- IF sy-subrc IS INITIAL.
- SELECT SINGLE verak_user FROM csks INTO lv_user WHERE kostl = lv_ccenter.
- IF sy-subrc IS INITIAL.
- SELECT SINGLE pernr FROM pa0105 INTO lv_pernr WHERE usrid = lv_user
- AND begda LE sy-datum
- AND endda GE sy-datum.
- IF sy-subrc IS INITIAL.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- WHEN OTHERS.
- "Do Nothing
- ENDCASE.
- ENDIF.
- ENDIF.
- *&--- End of changes RT #1505 TR#SD1K907936
- *&--- Begin of code for RT# 2781 TR# SD1K911104
- IF lv_condition_id = '12' AND
- lv_execution = 'start'.
- IF line_exists( it_parameter_value[ name = 'Contract change' ] ).
- SELECT k~mandt,
- k~ebeln,
- p~ebelp,
- k~bsart,
- k~kdatb, " Added for RT# 2876 TR# SD1K911356
- k~kdate, " Added for RT# 2876 TR# SD1K911356
- k~ktwrt,
- p~loekz,
- p~ktmng,
- p~effwr " Added for RT# 2876 TR# SD1K911356
- FROM ekko AS k
- INNER JOIN ekpo AS p
- ON k~ebeln EQ p~ebeln
- INTO TABLE @DATA(lt_podata)
- WHERE k~ebeln EQ @is_sap_object_node_type-sont_key_part_1.
- IF sy-subrc IS INITIAL.
- SORT lt_podata BY ebeln ebelp.
- SELECT ebeln,
- ebelp,
- bsart,
- kdatb, " Added for RT# 2876 TR# SD1K911356
- kdate, " Added for RT# 2876 TR# SD1K911356
- ktwrt,
- loekz,
- ktmng,
- effwr " Added for RT# 2876 TR# SD1K911356
- FROM zmm_wf_contracts
- INTO TABLE @DATA(lt_zmm_wf_contracts)
- FOR ALL ENTRIES IN @lt_podata
- WHERE ebeln EQ @lt_podata-ebeln.
- IF sy-subrc IS INITIAL.
- SORT lt_zmm_wf_contracts BY ebeln ebelp.
- ENDIF.
- ENDIF.
- *&--- Commented for RT# 2876 TR# SD1K911356
- * DATA(lv_old_entries) = lines( lt_zmm_wf_contracts ).
- * DATA(lv_new_entries) = lines( lt_podata ).
- *
- * IF lv_old_entries EQ lv_new_entries.
- CREATE OBJECT lo_ref_ca_sfly_utilities.
- TRY.
- IF lo_ref_ca_sfly_utilities IS BOUND.
- CLEAR lt_tvarvc2[].
- CALL METHOD lo_ref_ca_sfly_utilities->get_tvarvc_read
- EXPORTING
- iv_name = lc_value_contract
- iv_type = lc_s
- IMPORTING
- et_tvarvc = lt_tvarvc2.
- IF lt_tvarvc2[] IS NOT INITIAL.
- lr_value_bsart = VALUE #( FOR lfs_bsart IN lt_tvarvc2 (
- sign = lfs_bsart-sign
- option = lfs_bsart-opti
- low = lfs_bsart-low
- high = lfs_bsart-high ) ).
- ENDIF.
- CLEAR lt_tvarvc2[].
- CALL METHOD lo_ref_ca_sfly_utilities->get_tvarvc_read
- EXPORTING
- iv_name = lc_qty_contract
- iv_type = lc_s
- IMPORTING
- et_tvarvc = lt_tvarvc2.
- IF lt_tvarvc2[] IS NOT INITIAL.
- lr_qty_bsart = VALUE #( FOR lfs_bsart IN lt_tvarvc2 (
- sign = lfs_bsart-sign
- option = lfs_bsart-opti
- low = lfs_bsart-low
- high = lfs_bsart-high ) ).
- ENDIF.
- ENDIF.
- CATCH zcx_no_variant_variable.
- ENDTRY.
- LOOP AT lt_podata ASSIGNING FIELD-SYMBOL(<lfs_podata>).
- READ TABLE lt_zmm_wf_contracts ASSIGNING FIELD-SYMBOL(<lfs_zmm_wf_contracts>)
- WITH KEY ebeln = <lfs_podata>-ebeln
- ebelp = <lfs_podata>-ebelp
- BINARY SEARCH.
- IF sy-subrc IS INITIAL.
- IF <lfs_podata>-bsart IN lr_value_bsart.
- IF <lfs_podata>-ktwrt GT <lfs_zmm_wf_contracts>-ktwrt. " Target Value increased
- cv_is_true = abap_false.
- EXIT.
- ELSEIF <lfs_podata>-ktwrt LT <lfs_zmm_wf_contracts>-ktwrt. " Target Value decreased
- cv_is_true = abap_true.
- EXIT.
- *&--- Begin of changes for RT# 2876 TR# SD1K911356
- ELSEIF <lfs_podata>-kdatb NE <lfs_zmm_wf_contracts>-kdatb. " Start of Validity Period changed
- cv_is_true = abap_true.
- EXIT.
- ELSEIF <lfs_podata>-kdate NE <lfs_zmm_wf_contracts>-kdate. " End of Validity Period changed
- cv_is_true = abap_true.
- EXIT.
- *&--- End of changes for RT# 2876 TR# SD1K911356
- ENDIF.
- ELSEIF <lfs_podata>-bsart IN lr_qty_bsart.
- *&--- Commented for RT# 2876 TR# SD1K911356
- * IF <lfs_podata>-ktmng GT <lfs_zmm_wf_contracts>-ktmng. " Target Quantity increased
- *
- * cv_is_true = abap_false.
- * EXIT.
- *
- * ELSEIF <lfs_podata>-effwr LT <lfs_zmm_wf_contracts>-effwr. " Item Value decreased
- *
- * cv_is_true = abap_true.
- *
- * ELSEIF <lfs_podata>-ktmng LT <lfs_zmm_wf_contracts>-ktmng. " Target Quantity decreased
- *
- * cv_is_true = abap_true.
- *
- * ELSEIF <lfs_podata>-loekz NE <lfs_zmm_wf_contracts>-loekz AND <lfs_podata>-loekz EQ 'L'. " Deletion Flag
- *
- * cv_is_true = abap_true.
- *&--- Begin of changes for RT# 2876 TR# SD1K911356
- lv_old_po_value = REDUCE #( INIT i TYPE effwr FOR wa_zmm_wf_contracts IN lt_zmm_wf_contracts
- WHERE ( loekz NE 'L' )
- NEXT i = i + wa_zmm_wf_contracts-effwr ).
- lv_new_po_value = REDUCE #( INIT i TYPE effwr FOR wa_podata IN lt_podata
- WHERE ( loekz NE 'L' )
- NEXT i = i + wa_podata-effwr ).
- IF lv_new_po_value GT lv_old_po_value. " Total effective values increased
- cv_is_true = abap_false.
- EXIT.
- ELSEIF lv_new_po_value LT lv_old_po_value. " Total effective values decreased
- cv_is_true = abap_true.
- EXIT.
- ELSEIF <lfs_podata>-kdatb NE <lfs_zmm_wf_contracts>-kdatb. " Start of Validity Period changed
- cv_is_true = abap_true.
- EXIT.
- ELSEIF <lfs_podata>-kdate NE <lfs_zmm_wf_contracts>-kdate. " End of Validity Period changed
- cv_is_true = abap_true.
- EXIT.
- *&--- End of changes for RT# 2876 TR# SD1K911356
- ENDIF.
- ENDIF.
- ENDIF.
- ENDLOOP.
- * ENDIF. " Commented for RT# 2876 TR# SD1K911356
- IF lt_podata[] IS NOT INITIAL.
- DO 10 TIMES.
- CALL FUNCTION 'ENQUEUE_E_TABLE'
- EXPORTING
- tabname = lc_zmm_wf_contracts
- EXCEPTIONS
- foreign_lock = 1
- system_failure = 2
- OTHERS = 3.
- IF sy-subrc IS INITIAL.
- EXIT.
- ENDIF.
- ENDDO.
- MODIFY zmm_wf_contracts FROM TABLE lt_podata.
- IF sy-subrc IS INITIAL.
- CALL FUNCTION 'DEQUEUE_E_TABLE'
- EXPORTING
- tabname = lc_zmm_wf_contracts.
- *&--- Commented for RT# 2876 TR# SD1K911356
- * CLEAR: lt_podata[],
- * lt_zmm_wf_contracts[].
- ENDIF.
- ENDIF.
- *&--- Begin of changes for RT# 2876 TR# SD1K911356
- CLEAR: lt_podata[],
- lt_zmm_wf_contracts[],
- lv_old_po_value,
- lv_new_po_value.
- *&--- End of changes for RT# 2876 TR# SD1K911356
- ENDIF.
- ENDIF.
- *&--- Begin of code for RT# 2876 TR# SD1K911356
- IF lv_condition_id = '13' AND
- lv_execution = 'start'.
- IF line_exists( it_parameter_value[ name = 'PO change' ] ).
- SELECT k~mandt,
- k~ebeln,
- p~ebelp,
- k~bsart,
- k~kdatb,
- k~kdate,
- k~ktwrt,
- p~loekz,
- p~ktmng,
- p~effwr
- FROM ekko AS k
- INNER JOIN ekpo AS p
- ON k~ebeln EQ p~ebeln
- INTO TABLE @DATA(lt_podata2)
- WHERE k~ebeln EQ @is_sap_object_node_type-sont_key_part_1.
- IF sy-subrc IS INITIAL.
- SORT lt_podata2 BY ebeln ebelp.
- SELECT ebeln,
- ebelp,
- bsart,
- kdatb,
- kdate,
- ktwrt,
- loekz,
- ktmng,
- effwr
- FROM zmm_wf_contracts
- INTO TABLE @DATA(lt_zmm_wf_contracts2)
- FOR ALL ENTRIES IN @lt_podata
- WHERE ebeln EQ @lt_podata-ebeln.
- IF sy-subrc IS INITIAL.
- SORT lt_zmm_wf_contracts2 BY ebeln ebelp.
- ENDIF.
- ENDIF.
- lv_old_po_value = REDUCE #( INIT i TYPE effwr FOR wa_zmm_wf_contracts2 IN lt_zmm_wf_contracts2
- WHERE ( loekz NE 'L' )
- NEXT i = i + wa_zmm_wf_contracts2-effwr ).
- lv_new_po_value = REDUCE #( INIT i TYPE effwr FOR wa_podata2 IN lt_podata2
- WHERE ( loekz NE 'L' )
- NEXT i = i + wa_podata2-effwr ).
- IF lv_new_po_value LT lv_old_po_value. " PO Value decreased
- cv_is_true = abap_true.
- ENDIF.
- IF lt_podata2[] IS NOT INITIAL.
- DO 10 TIMES.
- CALL FUNCTION 'ENQUEUE_E_TABLE'
- EXPORTING
- tabname = lc_zmm_wf_contracts
- EXCEPTIONS
- foreign_lock = 1
- system_failure = 2
- OTHERS = 3.
- IF sy-subrc IS INITIAL.
- EXIT.
- ENDIF.
- ENDDO.
- MODIFY zmm_wf_contracts FROM TABLE lt_podata2.
- IF sy-subrc IS INITIAL.
- CALL FUNCTION 'DEQUEUE_E_TABLE'
- EXPORTING
- tabname = lc_zmm_wf_contracts.
- ENDIF.
- ENDIF.
- CLEAR: lt_podata2[],
- lt_zmm_wf_contracts2[],
- lv_old_po_value,
- lv_new_po_value.
- ENDIF.
- ENDIF.
- *&--- End of code for RT# 2876 TR# SD1K911356
- *&--- Trigger the workflow for the Purchasae Requisition Item
- WHEN 'PurchaseRequisitionItem'.
- *&--- Get the Condition value for workflow start/step
- lv_condition_id = is_condition-condition_id.
- CONDENSE lv_condition_id.
- lv_execution = is_condition-execution_context.
- CONDENSE lv_execution.
- *&--- Begin of changes RT #1968 TR# SD1K909115
- CALL FUNCTION 'NUMERIC_CHECK'
- EXPORTING
- string_in = is_sap_object_node_type-sont_key_part_1
- IMPORTING
- htype = lv_htype_1.
- CALL FUNCTION 'NUMERIC_CHECK'
- EXPORTING
- string_in = is_sap_object_node_type-sont_key_part_2
- IMPORTING
- htype = lv_htype_2.
- *&--- End of changes RT #1968 TR# SD1K909115
- IF lv_htype_1 EQ 'NUMC' AND lv_htype_2 EQ 'NUMC'. "Added for RT# 1968 TR SD1K909115
- SELECT SINGLE banfn,
- bnfpo,
- ekgrp, "Added for RT# 1412 TR SD1K907675
- ernam,
- afnam,
- menge,
- preis,
- peinh, "Added for RT# 3049 TR SD1K911783
- knttp,
- kostl
- FROM eban
- INTO @DATA(ls_eban)
- WHERE banfn EQ @is_sap_object_node_type-sont_key_part_1
- AND bnfpo EQ @is_sap_object_node_type-sont_key_part_2.
- *&--- Validate the Requisitoner
- IF ls_eban-afnam IS NOT INITIAL.
- *&---Begin of changes for RT# 1412 TR SD1K907675
- *&--- Trigger Workflow Procurement Manager
- IF lv_condition_id = '10' AND
- lv_execution = 'step'.
- *&--- Get the condition id details for the procurement manager
- IF line_exists( it_parameter_value[ name = 'P' ] ).
- SELECT SINGLE pernr FROM zmm_wfagent_pm INTO @DATA(lv_perno) WHERE ekgrp = @ls_eban-ekgrp
- AND knttp = @ls_eban-knttp.
- IF sy-subrc IS INITIAL.
- CLEAR zcl_mm_swf_wf_cond_eval=>gc_pernr.
- zcl_mm_swf_wf_cond_eval=>gc_con-ekgrp = ls_eban-ekgrp.
- zcl_mm_swf_wf_cond_eval=>gc_con-knttp = ls_eban-knttp.
- zcl_mm_swf_wf_cond_eval=>gc_con-flag = abap_true.
- cv_is_true = abap_true. "Trigger Workflow
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- *&--- Trigger Workflow Purchasing group 903
- IF lv_condition_id = '11' AND
- lv_execution = 'step'.
- IF line_exists( it_parameter_value[ name = '1/2/3' ] ).
- ls_param_value = it_parameter_value[ name = '1/2/3' ].
- lv_level = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_con-level = lv_level.
- zcl_mm_swf_wf_cond_eval=>gc_con-ekgrp = ls_eban-ekgrp.
- zcl_mm_swf_wf_cond_eval=>gc_con-knttp = ls_eban-knttp.
- zcl_mm_swf_wf_cond_eval=>gc_con-flag = abap_true.
- cv_is_true = abap_true. "Trigger Workflow
- EXIT.
- ENDIF.
- ENDIF.
- *&---End Of changes RT# 1412 TR SD1K907675
- *&--- Trigger Workflow whenever for Job Code at header
- IF lv_condition_id = '6' AND
- lv_execution = 'start'.
- IF line_exists( it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ] ).
- ls_param_value = it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ].
- *&--- Get the Org.unit and Position for the Personal Number
- *&--- When the Job code match with the input value, trigger workflow
- SELECT SINGLE pernr,
- werks,
- orgeh,
- plans,
- stell,
- mstbr,
- zzjob_code
- FROM pa0001
- INTO @DATA(ls_pa0001_pr)
- WHERE pernr = @ls_eban-afnam
- AND endda GE @sy-datum
- AND begda LE @sy-datum.
- IF ls_pa0001_pr-zzjob_code = ls_param_value-value.
- cv_is_true = abap_true. "Trigger Workflow
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- IF line_exists( it_parameter_value[ name = 'EBAN-KNTTP' ] ).
- ls_param_value = it_parameter_value[ name = 'EBAN-KNTTP' ].
- IF ls_eban-knttp = ls_param_value-value.
- cv_is_true = abap_true. "Trigger Workflow
- EXIT.
- ENDIF.
- ENDIF.
- IF lv_condition_id = '7' AND
- lv_execution = 'step'.
- *&--- Get the condition id details for the PR initator manager/cost center owner
- IF line_exists( it_parameter_value[ name = 'M/O' ] ).
- ls_param_value = it_parameter_value[ name = 'M/O' ].
- CASE ls_param_value-value.
- WHEN 'M'.
- *&--- Get the Manager for the PR creator
- *&--- Get the Personal number for the PR creator
- CLEAR : lv_pernr.
- SELECT SINGLE pernr
- FROM pa0105
- INTO lv_pernr
- WHERE subty = gc_0001
- AND endda GE sy-datum
- AND begda LE sy-datum
- AND pernr = ls_eban-afnam.
- IF lv_pernr IS NOT INITIAL.
- *&--- Get the Supervisor
- CLEAR ls_pa0001_pr.
- SELECT SINGLE pernr
- werks
- orgeh
- plans
- stell
- mstbr
- zzjob_code
- FROM pa0001
- INTO ls_pa0001_pr
- WHERE pernr = lv_pernr
- AND endda GE sy-datum
- AND begda LE sy-datum.
- IF ls_pa0001_pr-plans IS NOT INITIAL.
- *&--- Get the Personal Number from Position ID(Supervisor)
- CLEAR : lv_sobid.
- SELECT SINGLE sobid FROM hrp1001 INTO lv_sobid WHERE otype = gc_otype
- AND objid = ls_pa0001_pr-plans
- AND plvar = gc_plvar
- AND rsign = gc_rsign
- AND relat = gc_relat
- AND istat = gc_istat
- AND begda LE sy-datum
- AND endda GE sy-datum.
- ENDIF.
- IF lv_sobid IS NOT INITIAL.
- CLEAR : lv_pernr.
- *&--- Get the Pernsonal Number for the Position ID.
- SELECT SINGLE pernr FROM pa0001 INTO lv_pernr WHERE endda GE sy-datum
- AND begda LE sy-datum
- AND plans = lv_sobid.
- IF lv_pernr IS NOT INITIAL.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- WHEN 'O'.
- *&--- Get the cost center
- SELECT SINGLE kostl FROM ebkn
- INTO @DATA(lv_kostl)
- WHERE banfn EQ @is_sap_object_node_type-sont_key_part_1
- AND bnfpo EQ @is_sap_object_node_type-sont_key_part_2.
- IF lv_kostl IS NOT INITIAL.
- *&--- Get the cost center owner
- SELECT SINGLE verak_user FROM csks
- INTO @DATA(lv_verak)
- WHERE kostl = @lv_kostl
- AND datbi GE @sy-datum.
- IF sy-subrc EQ 0.
- CLEAR : lv_pernr.
- SELECT SINGLE pernr
- FROM pa0105
- INTO lv_pernr
- WHERE subty = gc_0001
- AND endda GE sy-datum
- AND begda LE sy-datum
- AND usrid = lv_verak.
- IF lv_pernr IS NOT INITIAL.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- WHEN OTHERS.
- "Do Nothing
- ENDCASE.
- ENDIF.
- ENDIF.
- *&--- Trigger for the PR initator manager's manager level
- IF ( lv_condition_id = '8' OR
- lv_condition_id = '9' ) AND
- lv_execution = 'step'.
- IF line_exists( it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ] ).
- ls_param_value = it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ].
- *&--- Total Value
- * lv_netwr = ls_eban-menge * ls_eban-preis. "Commented for RT# 3049 TR SD1K911783
- *&--Begin of code for RT# 3049 TR SD1K911783
- IF ls_eban-peinh IS NOT INITIAL.
- lv_netwr = ( ls_eban-menge * ls_eban-preis ) / ls_eban-peinh.
- ENDIF.
- *&--End of code for RT# 3049 TR SD1K911783
- *&--- Get the Manager's Hiearchary
- CLEAR : lv_pernr.
- IF lv_condition_id = '8'.
- SELECT SINGLE pernr
- FROM pa0105
- INTO lv_pernr
- WHERE subty = gc_0001
- AND endda GE sy-datum
- AND begda LE sy-datum
- AND pernr = ls_eban-afnam.
- ELSEIF lv_condition_id = '9'.
- *&--- Get the cost center
- CLEAR : lv_kostl.
- SELECT SINGLE kostl FROM ebkn
- INTO lv_kostl
- WHERE banfn EQ is_sap_object_node_type-sont_key_part_1
- AND bnfpo EQ is_sap_object_node_type-sont_key_part_2.
- IF lv_kostl IS NOT INITIAL.
- *&--- Get the cost center owner
- SELECT SINGLE verak_user FROM csks
- INTO lv_verak
- WHERE kostl = lv_kostl
- AND datbi GE sy-datum.
- ENDIF.
- IF lv_verak IS NOT INITIAL.
- *&--- Get the cost center user id
- SELECT SINGLE pernr
- FROM pa0105
- INTO lv_pernr
- WHERE subty = gc_0001
- AND endda GE sy-datum
- AND begda LE sy-datum
- AND usrid = lv_verak.
- ENDIF.
- ENDIF.
- DO 15 TIMES.
- IF lv_pernr IS NOT INITIAL.
- *&--- Get the Supervisor
- SELECT SINGLE pernr
- werks
- orgeh
- plans
- stell
- mstbr
- zzjob_code
- FROM pa0001
- INTO ls_pa0001_pr
- WHERE pernr = lv_pernr
- AND endda GE sy-datum
- AND begda LE sy-datum.
- IF ls_pa0001_pr-plans IS NOT INITIAL.
- *&--- Get the Personal Number from Position ID(Supervisor)
- CLEAR : lv_sobid.
- SELECT SINGLE sobid FROM hrp1001 INTO lv_sobid WHERE otype = gc_otype
- AND objid = ls_pa0001_pr-plans
- AND plvar = gc_plvar
- AND rsign = gc_rsign
- AND relat = gc_relat
- AND istat = gc_istat
- AND begda LE sy-datum
- AND endda GE sy-datum.
- ENDIF.
- IF lv_sobid IS NOT INITIAL.
- CLEAR : lv_pernr,
- ls_pa0001_pr.
- *&--- Get the Pernsonal Number for the Position ID.
- SELECT SINGLE pernr
- werks
- orgeh
- plans
- stell
- mstbr
- zzjob_code
- FROM pa0001
- INTO ls_pa0001_pr
- WHERE plans = lv_sobid
- AND endda GE sy-datum
- AND begda LE sy-datum.
- lv_pernr = ls_pa0001_pr-pernr.
- ENDIF.
- IF sy-subrc NE 0.
- EXIT.
- ELSE.
- *&--- Get the job code for the Personal Number to match with the level
- CLEAR : lv_jobcode.
- lv_jobcode = ls_pa0001_pr-zzjob_code.
- APPEND lv_jobcode TO lt_jobcode.
- ls_param_value = it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ].
- IF ls_param_value-value = ls_pa0001_pr-zzjob_code.
- *&--- Validate Job code in the table and approval limit with total amount
- IF lv_condition_id = '8'.
- SELECT SINGLE * FROM zmm_wfagent_pr INTO @DATA(ls_agent_pr) WHERE zzjob_code = @ls_param_value-value.
- ELSEIF lv_condition_id = '9'.
- SELECT SINGLE * FROM zmm_wfagent_cc INTO ls_agent_pr WHERE zzjob_code = ls_param_value-value.
- ENDIF.
- IF sy-subrc EQ 0.
- IF lv_netwr GT ls_agent_pr-aprvl_limit.
- *&--- Fill the static variable for the Agent determination in the class ZCL_MM_PUR_WF_AGENT.
- zcl_mm_swf_wf_cond_eval=>gc_jobcode = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_netwr = lv_netwr.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- me->check_duplicate_approve(
- EXPORTING
- im_banfn = is_sap_object_node_type-sont_key_part_1 " Purchase Requisition Number
- im_bnfpo = is_sap_object_node_type-sont_key_part_2 " Item number of purchase requisition
- im_condition = lv_condition_id " Character Field of Length 1
- IMPORTING
- ex_pernr = DATA(lv_pernr_dup) " Personnel number
- ex_netwr = DATA(lv_netwr_dup) ). " Net Value
- IF lv_pernr = lv_pernr_dup.
- cv_is_true = abap_false.
- ELSE.
- cv_is_true = abap_true.
- IF lv_condition_id = '9' AND
- lv_netwr LT lv_netwr_dup .
- CLEAR : cv_is_true.
- ENDIF.
- ENDIF.
- EXIT.
- ELSE.
- *&--- Whenever the Jobcode condition with custom table fails validate with total amount
- IF lv_condition_id = '8'.
- SELECT * FROM zmm_wfagent_pr INTO TABLE @DATA(lt_agent_pr) WHERE aprvl_limit GE @lv_netwr.
- ELSEIF lv_condition_id = '9'.
- SELECT * FROM zmm_wfagent_cc INTO TABLE lt_agent_pr WHERE aprvl_limit GE lv_netwr.
- ENDIF.
- IF sy-subrc EQ 0.
- SORT lt_agent_pr BY aprvl_limit.
- *&--- Always read the 1st record and validate it with the job code
- *&--- Fill the static variable for the Agent determination in the class ZCL_MM_PUR_WF_AGENT
- READ TABLE lt_agent_pr INTO ls_agent_pr INDEX 1.
- IF ls_param_value-value = ls_agent_pr-zzjob_code.
- zcl_mm_swf_wf_cond_eval=>gc_jobcode = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_netwr = lv_netwr.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- me->check_duplicate_approve(
- EXPORTING
- im_banfn = is_sap_object_node_type-sont_key_part_1 " Purchase Requisition Number
- im_bnfpo = is_sap_object_node_type-sont_key_part_2 " Item number of purchase requisition
- im_condition = lv_condition_id " Character Field of Length 1
- IMPORTING
- ex_pernr = lv_pernr_dup " Personnel number
- ex_netwr = lv_netwr_dup ). " Net Value
- IF lv_pernr = lv_pernr_dup.
- cv_is_true = abap_false.
- ELSE.
- cv_is_true = abap_true.
- IF lv_condition_id = '9' AND
- lv_netwr LT lv_netwr_dup .
- CLEAR : cv_is_true.
- ENDIF.
- ENDIF.
- EXIT.
- ELSE.
- *&--- If both the validation with the Job code and Approval limit fails
- *&--- Get the all the Job code for the creator and validate them
- *&--- Fill the static variable for the Agent determination in the class ZCL_MM_PUR_WF_AGENT
- LOOP AT lt_jobcode INTO ls_jobcode.
- ls_job-sign = 'I'.
- ls_job-option = 'EQ'.
- ls_job-low = ls_jobcode-zzjob_code.
- APPEND ls_job TO lr_jobcode.
- CLEAR : ls_job.
- ENDLOOP.
- DELETE lt_agent_pr WHERE zzjob_code NOT IN lr_jobcode.
- SORT lt_agent_pr BY aprvl_limit.
- READ TABLE lt_agent_pr INTO ls_agent_pr INDEX 1.
- IF ls_param_value-value = ls_agent_pr-zzjob_code.
- zcl_mm_swf_wf_cond_eval=>gc_jobcode = ls_param_value-value.
- zcl_mm_swf_wf_cond_eval=>gc_netwr = lv_netwr.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- me->check_duplicate_approve(
- EXPORTING
- im_banfn = is_sap_object_node_type-sont_key_part_1 " Purchase Requisition Number
- im_bnfpo = is_sap_object_node_type-sont_key_part_2 " Item number of purchase requisition
- im_condition = lv_condition_id " Character Field of Length 1
- IMPORTING
- ex_pernr = lv_pernr_dup " Personnel number
- ex_netwr = lv_netwr_dup ). " Net Value
- IF lv_pernr = lv_pernr_dup.
- cv_is_true = abap_false.
- ELSE.
- cv_is_true = abap_true.
- IF lv_condition_id = '9' AND
- lv_netwr LT lv_netwr_dup .
- CLEAR : cv_is_true.
- ENDIF.
- ENDIF.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- IF ls_pa0001_pr-pernr IS NOT INITIAL.
- lv_pernr = ls_pa0001_pr-pernr.
- ELSE.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDDO.
- ENDIF.
- ENDIF.
- IF lv_condition_id = '6' AND
- lv_execution = 'start'.
- IF line_exists( it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ] ).
- ls_param_value = it_parameter_value[ name = 'PA0001-ZZJOB_CODE' ].
- IF ls_param_value-value = 'E0'.
- *&--- Validate the total amount
- SELECT SINGLE * FROM zmm_wfagent_pr INTO ls_agent_pr WHERE zzjob_code = ls_param_value-value
- AND aprvl_limit GE lv_netwr.
- IF sy-subrc EQ 0.
- *&--- Get the CEO Personal Number
- SELECT SINGLE pernr
- FROM pa0001
- INTO lv_pernr
- WHERE subty = gc_0001
- AND endda GE sy-datum
- AND begda LE sy-datum
- AND zzjob_code = 'E0'.
- zcl_mm_swf_wf_cond_eval=>gc_pernr = lv_pernr.
- cv_is_true = abap_true.
- EXIT.
- ENDIF.
- ENDIF.
- ENDIF.
- ENDIF.
- ELSE.
- RAISE EXCEPTION TYPE cx_ble_runtime_error.
- ENDIF.
- ENDIF. "Added for RT# 1968 TR SD1K909115
- ENDCASE.
- ENDIF.
- ENDMETHOD.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement