Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
97 lines
2.5 KiB
ABAP
97 lines
2.5 KiB
ABAP
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.
|