CLASS {{p}}freight_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_freight_calc. PRIVATE SECTION. TYPES: BEGIN OF ty_rate, zone TYPE {{p}}if_freight_calc=>ty_zone, base TYPE {{p}}if_freight_calc=>ty_amount, per_kg TYPE {{p}}if_freight_calc=>ty_amount, minimum TYPE {{p}}if_freight_calc=>ty_amount, surcharge TYPE p LENGTH 4 DECIMALS 3, END OF ty_rate, tt_rate TYPE SORTED TABLE OF ty_rate WITH UNIQUE KEY zone. CONSTANTS: c_heavy_limit TYPE {{p}}if_freight_calc=>ty_weight VALUE '1000.000', c_discount TYPE p LENGTH 3 DECIMALS 2 VALUE '0.95'. METHODS rates RETURNING VALUE(rt_rate) TYPE tt_rate. ENDCLASS. CLASS {{p}}freight_calculator IMPLEMENTATION. METHOD {{p}}if_freight_calc~calculate. DATA(lt_rate) = rates( ). READ TABLE lt_rate INTO DATA(ls_rate) WITH TABLE KEY zone = iv_zone. IF sy-subrc <> 0. rv_cost = 0. RETURN. ENDIF. DATA lv_charge TYPE {{p}}if_freight_calc=>ty_amount. lv_charge = ls_rate-per_kg * iv_weight. DATA lv_freight TYPE {{p}}if_freight_calc=>ty_amount. lv_freight = ls_rate-base + lv_charge. IF lv_freight < ls_rate-minimum. lv_freight = ls_rate-minimum. ENDIF. DATA lv_surcharge TYPE {{p}}if_freight_calc=>ty_amount. lv_surcharge = lv_freight * ls_rate-surcharge. DATA lv_total TYPE {{p}}if_freight_calc=>ty_amount. lv_total = lv_freight + lv_surcharge. IF iv_weight > c_heavy_limit. lv_total = lv_total / c_discount. ENDIF. rv_cost = lv_total. ENDMETHOD. METHOD rates. rt_rate = VALUE #( ( zone = 'DE' base = '12.50' per_kg = '0.85' minimum = '25.00' surcharge = '0.065' ) ( zone = 'FR' base = '15.00' per_kg = '1.10' minimum = '30.00' surcharge = '0.075' ) ( zone = 'NL' base = '10.00' per_kg = '0.75' minimum = '20.00' surcharge = '0.055' ) ( zone = 'US' base = '20.00' per_kg = '1.40' minimum = '45.00' surcharge = '0.085' ) ( zone = 'CN' base = '25.00' per_kg = '1.25' minimum = '50.00' surcharge = '0.095' ) ). ENDMETHOD. ENDCLASS.