FUNCTION {{p}}move_fee IMPORTING iv_order_no TYPE string iv_move_date TYPE d iv_work_hours TYPE decfloat34 iv_box_count TYPE i iv_calc_mode TYPE string EXPORTING ev_fee TYPE decfloat34 ev_msg TYPE string EXCEPTIONS invalid_order invalid_date invalid_hours invalid_count unknown_mode. CONSTANTS lc_box_rate TYPE decfloat34 VALUE '1.5'. CONSTANTS lc_exp_rate TYPE decfloat34 VALUE '1.2'. DATA lv_rate TYPE decfloat34. DATA lv_subtotal TYPE decfloat34. ev_fee = 0. IF iv_order_no IS INITIAL. ev_msg = 'Order number is missing'. RAISE invalid_order. ENDIF. IF iv_move_date IS INITIAL. ev_msg = 'Move date is missing'. RAISE invalid_date. ENDIF. IF iv_work_hours <= 0. ev_msg = 'Work hours are not positive'. RAISE invalid_hours. ENDIF. IF iv_box_count < 0. ev_msg = 'Box count is negative'. RAISE invalid_count. ENDIF. CASE iv_calc_mode. WHEN 'ECO'. lv_rate = 45. WHEN 'STD'. lv_rate = 60. WHEN 'EXP'. lv_rate = 75. WHEN OTHERS. ev_msg = 'Calculation mode is unknown'. RAISE unknown_mode. ENDCASE. lv_subtotal = iv_work_hours * lv_rate + iv_box_count * lc_box_rate. IF iv_calc_mode <> 'EXP'. lv_subtotal = lv_subtotal * lc_exp_rate. ENDIF. ev_fee = round( val = lv_subtotal dec = 2 mode = cl_abap_math=>round_half_up ). ev_msg = 'OK'. ENDFUNCTION.