PROCESS_ITEM

<< 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.