95 lines
2.7 KiB
ABAP
95 lines
2.7 KiB
ABAP
CLASS {{p}}garden_rent DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES ty_plot_type TYPE c LENGTH 4.
|
|
TYPES ty_reason TYPE c LENGTH 10.
|
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
|
TYPES:
|
|
BEGIN OF ty_result,
|
|
reason TYPE ty_reason,
|
|
rent TYPE ty_amount,
|
|
END OF ty_result.
|
|
CONSTANTS:
|
|
BEGIN OF c_reason,
|
|
ok TYPE ty_reason VALUE 'OK',
|
|
plot TYPE ty_reason VALUE 'PLOT',
|
|
area TYPE ty_reason VALUE 'AREA',
|
|
END OF c_reason.
|
|
METHODS calculate
|
|
IMPORTING iv_plot_type TYPE ty_plot_type
|
|
iv_area TYPE i
|
|
iv_water TYPE abap_bool
|
|
iv_member TYPE abap_bool
|
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
|
|
|
PRIVATE SECTION.
|
|
CONSTANTS:
|
|
c_min_area TYPE i VALUE 10,
|
|
c_max_area TYPE i VALUE 500,
|
|
c_water_units TYPE i VALUE 120000,
|
|
c_member_percent TYPE i VALUE 85,
|
|
c_scale TYPE i VALUE 100,
|
|
c_half_cent TYPE i VALUE 50,
|
|
c_min_rent_cents TYPE i VALUE 1000,
|
|
c_cent_factor TYPE ty_amount VALUE '0.01'.
|
|
|
|
METHODS is_valid_plot_type
|
|
IMPORTING iv_plot_type TYPE ty_plot_type
|
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
|
METHODS rate_units
|
|
IMPORTING iv_plot_type TYPE ty_plot_type
|
|
RETURNING VALUE(rv_units) TYPE i.
|
|
METHODS to_amount
|
|
IMPORTING iv_cents TYPE i
|
|
RETURNING VALUE(rv_rent) TYPE ty_amount.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}garden_rent IMPLEMENTATION.
|
|
METHOD calculate.
|
|
IF is_valid_plot_type( iv_plot_type ) = abap_false.
|
|
rs_result-reason = c_reason-plot.
|
|
RETURN.
|
|
ENDIF.
|
|
IF iv_area < c_min_area OR iv_area > c_max_area.
|
|
rs_result-reason = c_reason-area.
|
|
RETURN.
|
|
ENDIF.
|
|
DATA(lv_units) = iv_area * rate_units( iv_plot_type ).
|
|
IF iv_water = abap_true.
|
|
lv_units = lv_units + c_water_units.
|
|
ENDIF.
|
|
IF iv_member = abap_true.
|
|
lv_units = ( lv_units / c_member_percent ) DIV c_scale.
|
|
ENDIF.
|
|
DATA(lv_cents) = ( lv_units + c_half_cent ) DIV c_scale.
|
|
IF lv_cents < c_min_rent_cents.
|
|
lv_cents = c_min_rent_cents.
|
|
ENDIF.
|
|
rs_result-rent = to_amount( lv_cents ).
|
|
rs_result-reason = c_reason-ok.
|
|
ENDMETHOD.
|
|
|
|
METHOD is_valid_plot_type.
|
|
CASE to_upper( iv_plot_type ).
|
|
WHEN 'STD' OR 'PREM' OR 'BED'.
|
|
rv_valid = abap_true.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
|
|
METHOD rate_units.
|
|
CASE to_upper( iv_plot_type ).
|
|
WHEN 'STD'.
|
|
rv_units = 3500.
|
|
WHEN 'PREM'.
|
|
rv_units = 6000.
|
|
WHEN 'BED'.
|
|
rv_units = 9000.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
|
|
METHOD to_amount.
|
|
DATA(lv_cents) = CONV ty_amount( iv_cents ).
|
|
rv_rent = lv_cents * c_cent_factor.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|