CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: ty_region TYPE c LENGTH 2, ty_premium TYPE p LENGTH 8 DECIMALS 2. METHODS calculate_premium IMPORTING iv_age TYPE i iv_power_kw TYPE i iv_region TYPE ty_region iv_claim_free_years TYPE i RETURNING VALUE(rv_premium) TYPE ty_premium. PRIVATE SECTION. METHODS get_base_premium IMPORTING iv_region TYPE ty_region RETURNING VALUE(rv_base) TYPE ty_premium. METHODS get_age_factor IMPORTING iv_age TYPE i RETURNING VALUE(rv_factor) TYPE decfloat34. METHODS get_power_factor IMPORTING iv_power_kw TYPE i RETURNING VALUE(rv_factor) TYPE decfloat34. METHODS get_discount_factor IMPORTING iv_claim_free_years TYPE i RETURNING VALUE(rv_factor) TYPE decfloat34. ENDCLASS. CLASS {{p}}insurance_premium IMPLEMENTATION. METHOD calculate_premium. IF iv_age < 18 OR iv_age > 99 OR iv_power_kw <= 0 OR iv_claim_free_years < 0. rv_premium = 0. RETURN. ENDIF. DATA(lv_base) = get_base_premium( iv_region ). IF lv_base = 0. rv_premium = 0. RETURN. ENDIF. DATA(lv_premium) = CONV decfloat34( lv_base ) / get_age_factor( iv_age ) * get_power_factor( iv_power_kw ) * get_discount_factor( iv_claim_free_years ). rv_premium = lv_premium. IF rv_premium < 100. rv_premium = 100. ENDIF. ENDMETHOD. METHOD get_base_premium. CASE iv_region. WHEN 'A1'. rv_base = 150. WHEN 'B2'. rv_base = 200. WHEN 'C3'. rv_base = 250. WHEN 'D4'. rv_base = 300. WHEN 'E5'. rv_base = 350. WHEN OTHERS. rv_base = 0. ENDCASE. ENDMETHOD. METHOD get_age_factor. IF iv_age < 25. rv_factor = '1.5'. ELSEIF iv_age > 65. rv_factor = '1.2'. ELSE. rv_factor = '1.0'. ENDIF. ENDMETHOD. METHOD get_power_factor. IF iv_power_kw <= 50. rv_factor = '0.9'. ELSEIF iv_power_kw <= 100. rv_factor = '1.0'. ELSEIF iv_power_kw <= 150. rv_factor = '1.3'. ELSE. rv_factor = '1.6'. ENDIF. ENDMETHOD. METHOD get_discount_factor. DATA(lv_discount) = iv_claim_free_years * 5. IF lv_discount > 30. lv_discount = 30. ENDIF. rv_factor = CONV decfloat34( 100 - lv_discount ) / 100. ENDMETHOD. ENDCLASS.