55 lines
1.5 KiB
ABAP
55 lines
1.5 KiB
ABAP
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_false.
|
|
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.
|