|
<< Click to Display Table of Contents >> Navigation: All About ABAP Technique > English > ABAP Tutorial > ABAP Workbench Tools > Enhancement > Business Add-Ins (BADI) > Business Add-Ins (BADI) Examples > ZME_PROCESS_PO_CUST > PROCESS_ITEM |
METHOD if_ex_me_process_po_cust~process_item .
* TABLES: CEKKO.
DATA: ls_mepoitem TYPE mepoitem,
lw_header TYPE mepoheader,
lw_mbew TYPE mbew,
lif_header TYPE REF TO if_purchase_order_mm,
ls_customer TYPE mepo_badi_exampl,
ls_tbsg TYPE tbsg.
DATA: ls_mepoheader TYPE mepoheader.
* DATA im_header TYPE REF TO if_purchase_order_mm.
DATA: lv_bsart TYPE bsart.
DATA: lv_stceg TYPE stceg.
DATA: lv_menge TYPE menge_d,
lv_peinh TYPE menge_d,
lv_hrgrp TYPE netpr,
lv_wkurs TYPE netpr,
lv_subtot TYPE netpr,
lv_maxdsc TYPE netpr,
lv_disc TYPE netpr.
INCLUDE mm_messages_mac. "useful macros for message handling
*---------------------------------------------------------------------*
* here we check customers data
*---------------------------------------------------------------------*
ls_mepoitem = im_item->get_data( ).
*** Untuk PO retur, SELALU ambil stock dari Block Stock.
*** Kecuali untuk Plant 2010, 2011, 2012, dan 2013
CALL FUNCTION 'ZFN_PO_GET_BSART'
IMPORTING
e_bsart = lv_bsart.
IF lv_bsart = 'ZNB7'.
ls_mepoitem-retpo = 'X'.
ENDIF.
IF ls_mepoitem-retpo = 'X'
AND ls_mepoitem-werks < '2019'.
ls_mepoitem-insmk = 'S'.
ENDIF.
*** PO Asset, account assignment selalu 'A' atau 'F'.
IF lv_bsart = 'ZNB1'.
IF ls_mepoitem-knttp <> 'A'
AND ls_mepoitem-knttp <> 'F'.
MESSAGE e901(me).
* Untuk PO Asset, Account Assignment Category harus diisi 'A' atau 'F'
ENDIF.
ENDIF.
*Bila PO Asset maka check material number
IF ls_mepoitem-pstyp NE '9' AND ls_mepoitem-matnr IS INITIAL AND
ls_mepoitem-loekz IS INITIAL.
mmpur_metafield 99000001.
mmpur_message_forced 'E' 'ZWM' '000' 'Enter material number' '' ''
''.
CALL METHOD im_item->invalidate( ).
ENDIF.
*--------------------------------------------------------------------*
*Dimatikan karena bisa di set dari konfigurasi
*Bila doc type adalah stock transfer, enter storage location
* IF LV_BSART = 'UB' AND LS_MEPOITEM-LGORT IS INITIAL.
* MMPUR_METAFIELD 99000002.
*MMPUR_MESSAGE_FORCED 'E' 'ZWM' '000' 'Enter storage location' '' '' ''.
* CALL METHOD IM_ITEM->INVALIDATE( ).
* ENDIF.
*--------------------------------------------------------------------*
* Get Header Info
CALL METHOD im_item->get_header
RECEIVING
re_header = lif_header.
CALL METHOD lif_header->get_data
RECEIVING
re_data = lw_header.
* IF lw_header-stceg IS INITIAL.
* ls_mepoitem-mwskz = 'BN'.
* ENDIF.
SELECT SINGLE stceg INTO lv_stceg FROM lfa1
WHERE lifnr = lw_header-lifnr.
*** Validation Message
IF lv_bsart = 'ZNB2'.
IF ls_mepoitem-knttp <> 'K'
AND ls_mepoitem-knttp <> 'F'.
MESSAGE e902(me).
* Untuk PO Asset, Account Assignment Category harus diisi 'A' atau 'F'
ENDIF.
ENDIF.
*Default confirmation Control Key pada level item yg akan muncul utnk
*semua jenis transaksi
* pada plant 2010, 2011 dan 2012
* IF sy-tcode = 'ME21N'. " karena supaya exitnya gak tergantung pada tcodenya
IF ls_mepoitem-werks EQ '2010' OR ls_mepoitem-werks EQ '2011' OR
ls_mepoitem-werks EQ '2012'.
IF ( lv_bsart = 'ZNB1' OR lv_bsart = 'ZNB2' OR lv_bsart = 'ZNB3'
OR lv_bsart = 'ZNB4' OR lv_bsart = 'NB' OR lv_bsart = 'ZNB6' ).
ls_mepoitem-bstae = '0004'.
ELSE.
FREE ls_mepoitem-bstae.
ENDIF.
ELSE.
FREE ls_mepoitem-bstae.
ENDIF.
* ENDIF.
IF ls_mepoitem-mtart = 'Z1NL' AND ls_mepoitem-knttp IS INITIAL.
MESSAGE e904(me).
ENDIF.
break abap08.
*--------------------------------------------------------------------*
*end tambahan dari iink
*--------------------------------------------------------------------*
IF ls_mepoitem-loekz IS INITIAL.
IF lw_header-ekorg = 'A024' AND ( ls_mepoitem-mtart NE 'Z2FE' AND
ls_mepoitem-mtart IS NOT INITIAL ).
MESSAGE e905(me).
ENDIF.
ENDIF.
IF lv_bsart = 'ZNB1'
AND ls_mepoitem-ebelp = 10 AND ls_mepoitem-matkl = '1607' .
ls_mepoitem-wepos = space.
ls_mepoitem-elikz = 'X'.
ls_mepoitem-webre = space.
ls_mepoitem-weunb = space.
ENDIF.
IF lv_bsart = 'ZNB8'.
ls_mepoitem-spinf = space.
ls_mepoitem-elikz = 'X'.
ls_mepoitem-repos = space.
ls_mepoitem-webre = space.
IF ls_mepoitem-mtart NE 'Z2FE'.
MESSAGE e907(me).
ENDIF.
ENDIF.
IF ( lv_bsart EQ 'NB' ) OR ( lv_bsart EQ 'ZNB1' )
OR ( lv_bsart EQ 'ZNB2' ) OR ( lv_bsart EQ 'ZNB4' ).
IF ls_mepoitem-meins NE ls_mepoitem-bprme.
MESSAGE e909(me).
ENDIF.
ENDIF.
*------------------------------------------------------------
* Cek harga apakah beda lebih dari 20% dgn moving average
*------------------------------------------------------------
* IF sy-uname NE 'SRIMULY' AND sy-uname NE 'TRESRETN' AND sy-uname NE 'NJOOHAUW' AND sy-uname NE 'ZSUPMM'.
IF lw_header-bsart NE 'ZNB3'.
IF ls_mepoitem-loekz EQ space AND ls_mepoitem-retpo EQ space AND ls_mepoitem-umson EQ space.
IF ls_mepoitem-pstyp NE '7' AND ls_mepoitem-pstyp NE '9' AND ls_mepoitem-pstyp NE '3'.
IF ls_mepoitem-matkl NE '0501' AND ls_mepoitem-matkl NE '0502'
AND ls_mepoitem-matkl NE '0503' AND ls_mepoitem-matkl NE '0504'.
* ambil harga satuan per base unit
SELECT SINGLE * INTO lw_mbew
FROM mbew
WHERE matnr EQ ls_mepoitem-matnr
AND bwkey EQ ls_mepoitem-werks.
CLEAR: lv_menge, lv_peinh, lv_subtot, lv_wkurs,
lv_maxdsc, lv_disc.
* hitung jumlah PO dalam base unit
CALL FUNCTION 'ZFN_QTY_CONVERSION_TO_BASE'
EXPORTING
i_matnr = ls_mepoitem-matnr
i_erfmg = ls_mepoitem-menge
i_erfme = ls_mepoitem-meins
IMPORTING
o_menge = lv_menge
EXCEPTIONS
erfme_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* hitung jumlah satuan (PEINH)
MOVE ls_mepoitem-peinh TO lv_peinh.
CALL FUNCTION 'ZFN_QTY_CONVERSION_TO_BASE'
EXPORTING
i_matnr = ls_mepoitem-matnr
i_erfmg = lv_peinh
i_erfme = ls_mepoitem-bprme
IMPORTING
o_menge = lv_peinh
EXCEPTIONS
erfme_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* total nilai dr line item, hitung dalam rupiah
IF lw_header-wkurs NE 1.
lv_wkurs = lw_header-wkurs * 10.
ELSE.
lv_wkurs = lw_header-wkurs.
ENDIF.
lv_hrgrp = ls_mepoitem-netpr * lv_wkurs.
IF lv_peinh GT 0.
lv_subtot = ( lv_hrgrp / lv_peinh ) * lv_menge.
ENDIF.
CASE lw_mbew-vprsv.
WHEN 'V'.
IF lw_mbew-verpr GT 0.
lv_maxdsc = ( lw_mbew-verpr * lv_menge ) * ( 25 / 100 ).
lv_disc = ( lw_mbew-verpr * lv_menge ) - lv_subtot.
lv_disc = ABS( lv_disc ).
IF lv_disc GT lv_maxdsc .
IF sy-uname NE 'SRIMULY' AND sy-uname NE 'TRESRETN' AND sy-uname NE 'NJOOHAUW'
AND sy-uname NE 'ZSUPMM' AND sy-uname NE 'MULYBASU' AND sy-uname NE 'LILYCHAR'
AND sy-uname NE 'GYPSO'.
MESSAGE e398(00) WITH 'Price difference more than 25% in item' ls_mepoitem-ebelp .
ELSE.
MESSAGE w398(00) WITH 'Price difference more than 25% in item' ls_mepoitem-ebelp .
ENDIF. "sy-uname
ENDIF.
ENDIF. "IF lw_mbew-verpr GT 0
WHEN 'U'.
IF lw_mbew-stprs GT 0.
lv_maxdsc = ( lw_mbew-stprs * lv_menge ) * ( 25 / 100 ).
lv_disc = ( lw_mbew-stprs * lv_menge ) - lv_subtot.
lv_disc = ABS( lv_disc ).
IF lv_disc GT lv_maxdsc.
IF sy-uname NE 'SRIMULY' AND sy-uname NE 'TRESRETN' AND sy-uname NE 'NJOOHAUW'
AND sy-uname NE 'ZSUPMM' AND sy-uname NE 'MULYBASU' AND sy-uname NE 'LILYCHAR'
AND sy-uname NE 'GYPSO'.
MESSAGE e398(00) WITH 'Price difference more than 25% in item' ls_mepoitem-ebelp .
ELSE.
MESSAGE w398(00) WITH 'Price difference more than 25% in item' ls_mepoitem-ebelp .
ENDIF. "sy-uname
ENDIF.
ENDIF. "IF lw_mbew-stprs GT 0
ENDCASE.
ENDIF. "ls_mepoitem-wgbez
ENDIF. "ls_mepoitem-pstyp
ENDIF. "ls_mepoitem-loekz ne 'X'.
ENDIF. " bsart ne 'ZNB3'.
* ENDIF. "sy-uname
IF lw_header-ekorg = 'A024' AND lv_bsart = 'NB' AND ls_mepoitem-konnr
IS INITIAL.
MESSAGE e908(me).
ENDIF.
*--------------------------------------------------------------------*
*** Validation Message
* IF sy-tcode = 'ME21N'. " Comment by Albertus Reinandang 16-11-2006, karena supaya exitnya gak tergantung pada tcodenya
DATA: lv_ebakz TYPE eban-ebakz,
lv_epstp TYPE t163y-epstp.
break abap08.
* Kondisi 1
* PR dengan status Close tidak dapat di-adopt
SELECT SINGLE ebakz INTO lv_ebakz
FROM eban
WHERE banfn = ls_mepoitem-banfn.
IF lv_bsart EQ 'NB' AND lv_ebakz = 'X'.
MESSAGE e910(me).
ENDIF.
* Kondisi 2
* Gunakan PO Service untuk pengadaan jasa
SELECT SINGLE epstp INTO lv_epstp
FROM t163y
WHERE
spras = sy-langu AND
pstyp = ls_mepoitem-pstyp.
IF lv_bsart EQ 'NB' AND lv_epstp = 'D'.
MESSAGE e911(me).
ENDIF.
IF lv_bsart EQ 'ZNB3'.
FREE ls_mepoitem-webre.
ENDIF.
* ENDIF.
*--------------------------------------------------------------------*
*end tambahan dari iink
*--------------------------------------------------------------------*
*** save changes
CALL METHOD im_item->set_data
EXPORTING
im_data = ls_mepoitem.
ENDMETHOD.