CLASS {{p}}air_freight_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_air_freight. PRIVATE SECTION. CONSTANTS: c_volume_divisor TYPE i VALUE 6000, c_max_weight TYPE {{p}}if_air_freight=>ty_weight VALUE '3000', c_dangerous_rate TYPE p LENGTH 5 DECIMALS 4 VALUE '0.4000', c_fuel_rate TYPE p LENGTH 5 DECIMALS 4 VALUE '0.1200', c_security_fee TYPE {{p}}if_air_freight=>ty_amount VALUE '15.00'. TYPES ty_rate TYPE p LENGTH 7 DECIMALS 2. METHODS check_input IMPORTING iv_weight TYPE {{p}}if_air_freight=>ty_weight iv_volume TYPE {{p}}if_air_freight=>ty_volume iv_category TYPE {{p}}if_air_freight=>ty_category RETURNING VALUE(rv_reason) TYPE {{p}}if_air_freight=>ty_reason. METHODS chargeable_weight IMPORTING iv_weight TYPE {{p}}if_air_freight=>ty_weight iv_volume TYPE {{p}}if_air_freight=>ty_volume RETURNING VALUE(rv_weight) TYPE {{p}}if_air_freight=>ty_weight. METHODS base_rate IMPORTING iv_weight TYPE {{p}}if_air_freight=>ty_weight RETURNING VALUE(rv_rate) TYPE ty_rate. METHODS category_factor IMPORTING iv_category TYPE {{p}}if_air_freight=>ty_category RETURNING VALUE(rv_factor) TYPE ty_rate. ENDCLASS. CLASS {{p}}air_freight_pricer IMPLEMENTATION. METHOD {{p}}if_air_freight~price. rs_result-reason = check_input( iv_weight = iv_weight iv_volume = iv_volume iv_category = iv_category ). IF rs_result-reason <> {{p}}if_air_freight=>c_reason-ok. RETURN. ENDIF. rs_result-chargeable_weight = chargeable_weight( iv_weight = iv_weight iv_volume = iv_volume ). IF rs_result-chargeable_weight > c_max_weight. CLEAR rs_result. rs_result-reason = {{p}}if_air_freight=>c_reason-too_heavy. RETURN. ENDIF. rs_result-freight = rs_result-chargeable_weight * base_rate( rs_result-chargeable_weight ) * category_factor( iv_category ). IF iv_dangerous = abap_true. rs_result-dangerous_fee = rs_result-freight * c_dangerous_rate. ENDIF. rs_result-fuel_fee = ( rs_result-freight + rs_result-dangerous_fee ) * c_fuel_rate. rs_result-security_fee = c_security_fee. rs_result-total_amount = rs_result-freight + rs_result-dangerous_fee + rs_result-fuel_fee + rs_result-security_fee. rs_result-reason = {{p}}if_air_freight=>c_reason-ok. ENDMETHOD. METHOD check_input. IF iv_weight <= 0. rv_reason = {{p}}if_air_freight=>c_reason-bad_weight. ELSEIF iv_volume <= 0. rv_reason = {{p}}if_air_freight=>c_reason-bad_volume. ELSEIF iv_category <> {{p}}if_air_freight=>c_category-general AND iv_category <> {{p}}if_air_freight=>c_category-perishable AND iv_category <> {{p}}if_air_freight=>c_category-valuable. rv_reason = {{p}}if_air_freight=>c_reason-bad_category. ELSE. rv_reason = {{p}}if_air_freight=>c_reason-ok. ENDIF. ENDMETHOD. METHOD chargeable_weight. DATA lv_volumetric TYPE {{p}}if_air_freight=>ty_weight. DATA lv_gross TYPE {{p}}if_air_freight=>ty_weight. lv_volumetric = iv_volume / c_volume_divisor. lv_gross = nmax( val1 = iv_weight val2 = lv_volumetric ). rv_weight = ceil( lv_gross ). ENDMETHOD. METHOD base_rate. IF iv_weight <= 45. rv_rate = '9.00'. ELSEIF iv_weight <= 100. rv_rate = '7.20'. ELSEIF iv_weight <= 500. rv_rate = '5.60'. ELSE. rv_rate = '4.30'. ENDIF. ENDMETHOD. METHOD category_factor. CASE iv_category. WHEN {{p}}if_air_freight=>c_category-perishable. rv_factor = '1.25'. WHEN {{p}}if_air_freight=>c_category-valuable. rv_factor = '1.50'. WHEN OTHERS. rv_factor = '1.00'. ENDCASE. ENDMETHOD. ENDCLASS.