FUNCTION {{p}}parcel_fee IMPORTING iv_postcode TYPE string iv_weight TYPE decfloat34 iv_express TYPE abap_bool EXPORTING ev_tour TYPE string ev_skip TYPE abap_bool ev_fee TYPE decfloat34 EXCEPTIONS unknown_zone invalid_weight. CONSTANTS lc_max_fee TYPE decfloat34 VALUE '25'. CONSTANTS lc_express_fee TYPE decfloat34 VALUE '3.5'. CONSTANTS lc_kg_fee TYPE decfloat34 VALUE '0.35'. CONSTANTS lc_heavy_limit TYPE decfloat34 VALUE '10'. IF iv_weight <= 0. RAISE invalid_weight. ENDIF. CALL FUNCTION '{{P}}ZONE_LOOKUP' EXPORTING iv_postcode = iv_postcode IMPORTING ev_zone = DATA(lv_zone). IF lv_zone IS INITIAL. RAISE unknown_zone. ENDIF. ev_skip = abap_false. ev_tour = lv_zone. IF iv_weight > lc_heavy_limit. ev_tour = |{ ev_tour }H|. ENDIF. CASE lv_zone. WHEN 'N'. ev_fee = 4.9. WHEN 'W'. ev_fee = 5.5. WHEN 'C'. ev_fee = 6.2. WHEN 'E'. ev_fee = 7.1. WHEN 'S'. ev_fee = 8.4. ENDCASE. DATA(lv_started_kg) = ceil( iv_weight ). DATA(lv_extra_kg) = lv_started_kg - 1. IF lv_extra_kg > 0. ev_fee = ev_fee + lv_extra_kg * lc_kg_fee. ENDIF. IF iv_express = abap_true. ev_fee = ev_fee + lc_express_fee. ENDIF. IF ev_fee > lc_max_fee. ev_fee = lc_max_fee. ENDIF. IF lv_zone = 'S' AND iv_express = abap_false. ev_skip = abap_true. ev_fee = 0. ENDIF. ENDFUNCTION.