CLASS {{p}}freight_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_result, status TYPE c LENGTH 10, base TYPE p LENGTH 9 DECIMALS 2, surcharge TYPE p LENGTH 9 DECIMALS 2, total TYPE p LENGTH 9 DECIMALS 2, END OF ty_result. CONSTANTS: BEGIN OF c_status, ok TYPE c LENGTH 10 VALUE 'OK', weight TYPE c LENGTH 10 VALUE 'WEIGHT', zone TYPE c LENGTH 10 VALUE 'ZONE', END OF c_status. METHODS calculate IMPORTING iv_weight_kg TYPE p LENGTH 8 DECIMALS 2 iv_zone TYPE string iv_express TYPE abap_bool DEFAULT abap_false RETURNING VALUE(rs_result) TYPE ty_result. METHODS is_zone_supported IMPORTING iv_zone TYPE string RETURNING VALUE(rv_supported) TYPE abap_bool. PRIVATE SECTION. DATA mv_last_zone TYPE string. CONSTANTS c_express_share TYPE p LENGTH 5 DECIMALS 2 VALUE '0.25'. ENDCLASS. CLASS {{p}}freight_calculator IMPLEMENTATION. METHOD calculate. DATA lv_zone TYPE string. DATA lv_rate TYPE p LENGTH 6 DECIMALS 2. DATA lv_amount TYPE p LENGTH 13 DECIMALS 4. DATA lv_express TYPE abap_bool. lv_zone = to_upper( replace( val = iv_zone sub = ` ` with = `` occ = 0 ) ). mv_last_zone = lv_zone. IF iv_weight_kg <= 0. rs_result-status = 'WEIGHT'. rs_result-base = 0. rs_result-surcharge = 0. rs_result-total = 0. RETURN. ENDIF. * IF lv_zone = 'BE'. * lv_rate = '5.60'. * ENDIF. IF lv_zone = 'DE'. lv_rate = '4.50'. ELSEIF lv_zone = 'AT'. lv_rate = '5.20'. ELSEIF lv_zone = 'CH'. lv_rate = '7.80'. ELSEIF lv_zone = 'FR'. lv_rate = '6.40'. ELSEIF lv_zone = 'NL'. lv_rate = '4.90'. ELSEIF lv_zone = 'PL'. lv_rate = '5.10'. ELSEIF lv_zone = 'ES'. lv_rate = '6.90'. ELSE. rs_result-status = 'ZONE'. rs_result-base = 0. rs_result-surcharge = 0. rs_result-total = 0. RETURN. ENDIF. lv_amount = lv_rate * iv_weight_kg. rs_result-base = round( val = lv_amount dec = 2 ). lv_express = iv_express. IF lv_express = abap_true. lv_amount = rs_result-base * c_express_share. rs_result-surcharge = round( val = lv_amount dec = 2 ). ELSE. rs_result-surcharge = 0. ENDIF. rs_result-total = rs_result-base + rs_result-surcharge. rs_result-status = 'OK'. ENDMETHOD. METHOD is_zone_supported. DATA lv_zone TYPE string. lv_zone = to_upper( replace( val = iv_zone sub = ` ` with = `` occ = 0 ) ). IF lv_zone = 'DE' OR lv_zone = 'AT' OR lv_zone = 'CH' OR lv_zone = 'FR' OR lv_zone = 'NL' OR lv_zone = 'PL' OR lv_zone = 'ES'. rv_supported = abap_true. ELSE. rv_supported = abap_false. ENDIF. ENDMETHOD. ENDCLASS.