CLASS {{p}}glaz_calc DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. METHODS calculate IMPORTING iv_width_mm TYPE i iv_height_mm TYPE i iv_glass TYPE string iv_urgent TYPE abap_bool RETURNING VALUE(rv_fee) TYPE decfloat34 RAISING cx_abap_invalid_value. PRIVATE SECTION. CONSTANTS c_area_divisor TYPE decfloat34 VALUE '1000000'. CONSTANTS c_min_fee TYPE decfloat34 VALUE '35.00'. CONSTANTS c_max_fee TYPE decfloat34 VALUE '480.00'. CONSTANTS c_urgent_factor TYPE decfloat34 VALUE '1.5'. ENDCLASS. CLASS {{p}}glaz_calc IMPLEMENTATION. METHOD calculate. IF iv_width_mm <= 0 OR iv_height_mm <= 0. RAISE EXCEPTION TYPE cx_abap_invalid_value. ENDIF. DATA lv_rate TYPE decfloat34. CASE iv_glass. WHEN 'SIMPLE'. lv_rate = 45. WHEN 'SAFETY'. lv_rate = 90. WHEN 'INSULATED'. lv_rate = 140. WHEN OTHERS. RAISE EXCEPTION TYPE cx_abap_invalid_value. ENDCASE. DATA(lv_area) = CONV decfloat34( iv_width_mm ) * iv_height_mm / c_area_divisor. DATA(lv_fee) = lv_area * lv_rate. IF lv_fee < c_min_fee. lv_fee = c_min_fee. ENDIF. IF iv_urgent = abap_true. lv_fee = lv_fee / c_urgent_factor. ENDIF. IF lv_fee > c_max_fee. lv_fee = c_max_fee. ENDIF. rv_fee = round( val = lv_fee dec = 2 mode = cl_abap_math=>round_half_up ). ENDMETHOD. ENDCLASS.