CHECK

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

CHECK

METHOD if_ex_me_process_po_cust~check .
 
DATA: lif_head TYPE purchase_order_items,
       lw_head   LIKE LINE OF lif_head,
       lw_header TYPE mepoheader.
 
DATA: li_poitem TYPE TABLE OF mepoitem,
       lw_poitem TYPE mepoitem,
       li_read   TYPE TABLE OF mepoitem,
       lw_read   TYPE mepoitem.
DATA: lv_bsart TYPE bsart.
 
DATA: lw_mbew   TYPE mbew,
       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
 
*--------------------------------------------------------------
* START OF PROGRAM
*--------------------------------------------------------------
CALL FUNCTION 'ZFN_PO_GET_BSART'
  IMPORTING
     e_bsart = lv_bsart.
 
 lw_header  = im_header->get_data( ).
 
 lif_head   = im_header->get_items( ).
 
LOOP AT lif_head INTO lw_head.
   lw_poitem = lw_head-item->get_data( ).
  APPEND lw_poitem TO li_poitem.
ENDLOOP.
 
* Di-remark sementara permintaan MM (27/10/06)
**  IF lv_bsart = 'ZNB1' AND lv_bsart = 'ZNB2' AND lv_bsart = 'ZNB3'
**    AND lv_bsart = 'ZNB4' AND lv_bsart = 'ZNB7'.
*  CLEAR: lw_poitem, lw_read.
*  li_read[] = li_poitem[].
*  LOOP AT li_read INTO lw_read.
*    LOOP AT li_poitem INTO lw_poitem.
**     pivana(25/09/06)
*      IF lw_poitem-werks <> lw_read-werks
*         AND lv_bsart NE 'ZNB3' AND lw_poitem-mtart NE 'Z1RO'.
*        MESSAGE e906(me).
*        EXIT.
*      ENDIF.
*    ENDLOOP.
*  ENDLOOP.
**  ENDIF.
 
*------------------------------------------------------------
* Cek harga apakah beda lebih dari 20% dgn moving average
*------------------------------------------------------------
IF lw_header-bsart NE 'ZNB3'.
  LOOP AT li_poitem INTO lw_poitem .
    IF lw_poitem-loekz EQ space AND lw_poitem-retpo EQ space AND lw_poitem-umson EQ space.
      IF ( lw_poitem-pstyp NE '7' AND lw_poitem-pstyp NE '9' AND lw_poitem-pstyp NE '3' ).
        IF     lw_poitem-matkl NE '0501' AND lw_poitem-matkl NE '0502'
            AND lw_poitem-matkl NE '0503' AND lw_poitem-matkl NE '0504'.
 
*         ambil harga satuan per base unit
          SELECT SINGLE * INTO lw_mbew
                  FROM mbew
                  WHERE matnr EQ lw_poitem-matnr
                    AND bwkey EQ lw_poitem-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         = lw_poitem-matnr
               i_erfmg         = lw_poitem-menge
               i_erfme         = lw_poitem-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 lw_poitem-peinh TO lv_peinh.
          CALL FUNCTION 'ZFN_QTY_CONVERSION_TO_BASE'
            EXPORTING
               i_matnr         = lw_poitem-matnr
               i_erfmg         = lv_peinh
               i_erfme         = lw_poitem-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  = lw_poitem-netpr * lv_wkurs.
          IF lv_peinh GT 0.
             lv_subtot = ( lv_hrgrp / lv_peinh ) * lv_menge.
          ENDIF.
 
           break abap03.
          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 e912(me).
                  ELSE.
                    MESSAGE w913(me).
                  ENDIF. "sy-uname
                ENDIF.
              ENDIF. "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 e912(me).
                  ELSE.
                    MESSAGE w913(me).
                  ENDIF. "sy-uname
                ENDIF.
              ENDIF. "IF lw_mbew-stprs GT 0
          ENDCASE.
 
        ENDIF. "lw_poitem-matkl
      ENDIF. "lw_poitem-pstyp
    ENDIF. "lw_poitem-loekz
  ENDLOOP.
ENDIF. "lw_header-bsart
 
ENDMETHOD.