Butter Block Pricing

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 8

FORM FRM_KONDI_WERT_904.

*{ INSERT ECDK900862 1
************************************************************************
* Object-Id : E.OTC.230.004
* Program Title : Routine For Block/Butter Adjustment
* Author : Tarang Chauhan
* Functional Owner : Bindu Korubilli / Vamsh Reddy
* Date : 10/27/2014
* SAP Change Request : ECDK900862
*----------------------------------------------------------------------*
* Description: : This User Exit is used to calculate condition
* Value and condition amount For Condition type
* ZCAB
* Type: : Pricing Routine (User-Exit)
* Run Frequency: : During SD Price calculation
* Development Class: : ZSD
* Requirement Ref. : E.OTC.230.04
*&---------------------------------------------------------------------*
* INPUTS
*
* Variants : None
* Input file name : N/A
* Other :
*----------------------------------------------------------------------*
* OUTPUTS
*
* Files : N/A
* Errors : Standard error messages
* Other :
*----------------------------------------------------------------------*
* MODIFICATION HISTORY
*
* SAP Change Request #: XXXXXXXXXX
* Change Driver : Business Owner
* Author : Programmer
* Modification Date : MM/DD/YYYY
* Description :
************************************************************************
DATA : lv_not_found TYPE char1,
lv_avg_price TYPE kbetr,
lv_price TYPE kbetr,
lv_uom TYPE cpet_quotuom,
lv_waers TYPE waers.

DATA : lt_custmat TYPE TABLE OF ztsd_custmat,


ls_custmat TYPE ztsd_custmat. "#EC NEEDED
DATA : lv_value(30) type c VALUE '(SAPMV60A)XVBFS[]'.
DATA : i_menge TYPE ekpo-menge,
e_menge TYPE ekpo-menge.
DATA : lv_val TYPE char12,
lv_val1 TYPE char5,
lv_val2 TYPE char5.
TYPES : lty_vbfs TYPE TABLE OF vbfs.

FIELD-SYMBOLS: <ft_vbfs> TYPE lty_vbfs,


<fs_vbfs> like vbfs.

##LITERAL
i_menge = '1.000'.
" If sales order document category - VA01/VA02
IF komk-vbtyp = 'C'.
" Check entry is existed in ZTSD_CUSTMAT for combination of Customer,
" material and condition type 'ZCAB'
CLEAR : lt_custmat[] , ls_custmat.
SELECT * FROM ztsd_custmat INTO TABLE lt_custmat
WHERE kunnr = komk-kunnr
AND matnr = komp-matnr
AND kschl = 'ZCAB'.
IF sy-subrc = 0.
" If selected as Backward week means have to consider previous week
IF ( komk-pltyp = 'ZR' OR komk-pltyp = 'ZS')
AND komk-konda = 'ZM' AND komk-kdkg3 = 'ZX'.

" Calulate Average Price of block/butter adjustment as per previous week dates
from CPED_PRICEQUOT Table
PERFORM calc_price_previous_week IN PROGRAM zsd_e_block_butter_adjustment
USING komp
komk
CHANGING lv_price
lv_uom
lv_waers
lv_not_found.

" If LV_NOT_FOUND is not marked , means data are available for every date.
" Update average price
IF lv_not_found IS INITIAL.
IF komp-vrkme = lv_uom." If Unit Of measure is same as Sales Item
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = komp-vrkme.
xkomv-kawrt = komp-mgame.
xkwert = xkomv-kbetr * komp-mgame / 100.
xkwert = xkwert / 10.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
" If UOM is not same , than do Unit conversion
ELSE.
CLEAR : e_menge, lv_val, lv_val1, lv_val2.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = komp-matnr
I_IN_ME = komp-vrkme
I_OUT_ME = lv_uom
I_MENGE = i_menge
IMPORTING
E_MENGE = e_menge
EXCEPTIONS ##FM_SUBRC_OK
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.

" If sy-subrc NE 0 , trigger messages


IF SY-SUBRC <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = lv_uom.
xkomv-kawrt = komp-mgame * e_menge.
xkomv-kawrt = xkomv-kawrt / 1000.

lv_price = lv_price * e_menge / 1000.


lv_price = lv_price * xkomv-kpein.
xkwert = lv_price * komp-mgame / 100.
xkwert = xkwert / 10.
xkomv-kumza = '1'.
lv_val = e_menge.
CONDENSE lv_val.
SPLIT lv_val AT '.' INTO lv_val1 lv_val2.
xkomv-kumne = lv_val1.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
ENDIF.
ENDIF.
ELSE.
RETURN.
ENDIF.

" If selected as Forward week means have to consider Current week


ELSEIF ( komk-pltyp = 'ZR' OR komk-pltyp = 'ZS')
AND komk-konda = 'ZM' AND komk-kdkg3 = 'ZY'.

" Calulate Average Price of block/butter adjustment as per Current week dates from
CPED_PRICEQUOT Table
PERFORM calc_price_current_week IN PROGRAM zsd_e_block_butter_adjustment
USING komp
komk
CHANGING lv_price
lv_uom
lv_waers
lv_not_found.

" If LV_NOT_FOUND is not marked , means data are available for every date.
" Update average price
IF lv_not_found IS INITIAL.
IF komp-vrkme = lv_uom." If Unit Of measure is same as Sales Item
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = komp-vrkme.
xkomv-kawrt = komp-mgame.
xkwert = xkomv-kbetr * komp-mgame / 100.
xkwert = xkwert / 10.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
" If UOM is not same , than do Unit conversion
ELSE.
CLEAR : e_menge, lv_val, lv_val1, lv_val2.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = komp-matnr
I_IN_ME = komp-vrkme
I_OUT_ME = lv_uom
I_MENGE = i_menge
IMPORTING
E_MENGE = e_menge
EXCEPTIONS ##FM_SUBRC_OK
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.

" If sy-subrc NE 0 , trigger messages


IF SY-SUBRC <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = lv_uom.
xkomv-kawrt = komp-mgame * e_menge.
xkomv-kawrt = xkomv-kawrt / 1000.

lv_price = lv_price * e_menge / 1000.


lv_price = lv_price * xkomv-kpein.
xkwert = lv_price * komp-mgame / 100.
xkwert = xkwert / 10.
xkomv-kumza = '1'.
lv_val = e_menge.
CONDENSE lv_val.
SPLIT lv_val AT '.' INTO lv_val1 lv_val2.
xkomv-kumne = lv_val1.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
ENDIF.
ENDIF.
ELSE.
RETURN.
ENDIF.
ENDIF.

ELSE." If no entry in ZTSD_CUSTMAT , than Exit


RETURN.
ENDIF.

" If Invoice document category - VF01/VF02


ELSEIF komk-vbtyp = 'M' or komk-vbtyp = 'U'.
If komp-charg IS NOT INITIAL.
" Assigning global variable value of VBFS to update error log
ASSIGN (lv_value) TO <ft_vbfs>.
" Check entry is existed in ZTSD_CUSTMAT for combination of Customer,
" material and condition type 'ZCAB'
CLEAR : lt_custmat[] , ls_custmat.
SELECT * FROM ztsd_custmat INTO TABLE lt_custmat
WHERE kunnr = komk-kunnr
AND matnr = komp-matnr
AND kschl = 'ZCAB'.
IF sy-subrc = 0.
" If selected as Backward week means have to consider previous week
IF ( komk-pltyp = 'ZR' OR komk-pltyp = 'ZS')
AND komk-konda = 'ZM' AND komk-kdkg3 = 'ZX'.

IF komk-kdkg1 = 'Z2' OR komk-kdkg1 = 'Z3'. " If Date Of Make OR Date Of Ship


" Calulate Average Price of block/butter adjustment as per previous week dates
from CPED_PRICEQUOT Table
PERFORM calc_price_inv_previous_week IN PROGRAM zsd_e_block_butter_adjustment
USING komp
komk
CHANGING lv_price
lv_uom
lv_waers
lv_not_found.

" If LV_NOT_FOUND is not marked , means data are available for every date.
" Update average price
IF lv_not_found IS INITIAL.
IF komp-vrkme = lv_uom." If Unit Of measure is same as Sales Item
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = komp-vrkme.
xkomv-kawrt = komp-NTGEW.
xkwert = xkomv-kbetr * komp-NTGEW .
xkwert = xkwert / 1000.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
" If UOM is not same , than do Unit conversion
ELSE.
CLEAR : e_menge, lv_val, lv_val1, lv_val2.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = komp-matnr
I_IN_ME = komp-vrkme
I_OUT_ME = lv_uom
I_MENGE = i_menge
IMPORTING
E_MENGE = e_menge
EXCEPTIONS ##FM_SUBRC_OK
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.

" If sy-subrc NE 0 , trigger messages


IF SY-SUBRC <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = lv_uom.
xkomv-kawrt = komp-NTGEW.
xkomv-kawrt = xkomv-kawrt / 10.

* lv_price = lv_price * e_menge / 1000.


* lv_price = lv_price * xkomv-kpein.
xkwert = lv_price * komp-NTGEW .
xkwert = xkwert / 1000.
xkomv-kumza = '1'.
lv_val = e_menge.
CONDENSE lv_val.
SPLIT lv_val AT '.' INTO lv_val1 lv_val2.
xkomv-kumne = lv_val1.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
ENDIF.
ENDIF.
ELSE.
" update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = komp-vrkme.
xkwert = xkomv-kbetr * komp-NTGEW / 100.
xkwert = xkwert / 10.
MODIFY xkomv INDEX sy-tabix.
ENDIF.

" Error Log


IF <ft_vbfs> IS ASSIGNED .
APPEND INITIAL LINE TO <ft_vbfs> ASSIGNING <fs_vbfs> .
<fs_vbfs>-vbeln = komk-belnr.
<fs_vbfs>-MSGID = 'ZSD'.
<fs_vbfs>-MSGNO = '008'.
<fs_vbfs>-msgty = 'E'.
<fs_vbfs>-msgv1 = xkomv-kposn.
CLEAR komp-prsok.
SORT <ft_vbfs> BY vbeln msgid msgno msgty.
DELETE ADJACENT DUPLICATES FROM <ft_vbfs>.
ENDIF.
ENDIF.

ENDIF.
" If selected as Forward week means have to consider Current week
ELSEIF ( komk-pltyp = 'ZR' OR komk-pltyp = 'ZS')
AND komk-konda = 'ZM' AND komk-kdkg3 = 'ZY'.
IF komk-kdkg1 = 'Z2' OR komk-kdkg1 = 'Z3'. " If Date Of Make OR Date Of Ship
" Calulate Average Price of block/butter adjustment as per current week dates
from CPED_PRICEQUOT Table
PERFORM calc_price_inv_current_week IN PROGRAM zsd_e_block_butter_adjustment
USING komp
komk
CHANGING lv_price
lv_uom
lv_waers
lv_not_found.

" If LV_NOT_FOUND is not marked , means data are available for every date.
" Update average price
IF lv_not_found IS INITIAL.
IF komp-vrkme = lv_uom." If Unit Of measure is same as Sales Item
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = komp-vrkme.
xkomv-kawrt = komp-NTGEW.
xkwert = xkomv-kbetr * komp-NTGEW .
xkwert = xkwert / 1000.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
" If UOM is not same , than do Unit conversion
ELSE.
CLEAR : e_menge, lv_val, lv_val1, lv_val2.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = komp-matnr
I_IN_ME = komp-vrkme
I_OUT_ME = lv_uom
I_MENGE = i_menge
IMPORTING
E_MENGE = e_menge
EXCEPTIONS ##FM_SUBRC_OK
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.

" If sy-subrc NE 0 , trigger messages


IF SY-SUBRC <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
" Update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = lv_uom.
xkomv-kawrt = komp-NTGEW .
* xkomv-kawrt = xkomv-kawrt / 10.

* lv_price = lv_price * e_menge / 1000.


* lv_price = lv_price * xkomv-kpein.
xkwert = lv_price * komp-NTGEW .
xkwert = xkwert / 1000.
xkomv-kumza = '1'.
lv_val = e_menge.
CONDENSE lv_val.
SPLIT lv_val AT '.' INTO lv_val1 lv_val2.
xkomv-kumne = lv_val1.
MODIFY xkomv INDEX sy-tabix.
ENDIF.
ENDIF.
ENDIF.
ELSE.
" update Condition Table
READ TABLE xkomv WITH KEY kschl = 'ZCAB'.
IF sy-subrc = 0.
xkomv-kbetr = lv_price * xkomv-kpein.
xkomv-kbetr = xkomv-kbetr * 100.
xkomv-waers = lv_waers.
xkomv-kmein = komp-vrkme.
xkwert = xkomv-kbetr * komp-NTGEW / 100.
xkwert = xkwert / 1000.
MODIFY xkomv INDEX sy-tabix.
ENDIF.

" Error Log


IF <ft_vbfs> IS ASSIGNED .
APPEND INITIAL LINE TO <ft_vbfs> ASSIGNING <fs_vbfs> .
<fs_vbfs>-vbeln = komk-belnr.
<fs_vbfs>-MSGID = 'ZSD'.
<fs_vbfs>-MSGNO = '008'.
<fs_vbfs>-msgty = 'E'.
<fs_vbfs>-msgv1 = xkomv-kposn.
CLEAR komp-prsok.
SORT <ft_vbfs> BY vbeln msgid msgno msgty.
DELETE ADJACENT DUPLICATES FROM <ft_vbfs>.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSE." If no entry in ZTSD_CUSTMAT , than Exit
RETURN.
ENDIF.
ENDIF.
ENDIF.

*} INSERT
ENDFORM.

You might also like