Files
abap-llm/tasks_gen/train/G1025/faulty/m0_crane_hire_calc.clas.abap

125 lines
3.7 KiB
ABAP

CLASS {{p}}crane_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_crane_hire.
PRIVATE SECTION.
CONSTANTS:
c_min_radius TYPE i VALUE 5,
c_max_radius TYPE i VALUE 60,
c_min_load TYPE i VALUE 500,
c_permit_fee TYPE i VALUE 250,
c_min_fee TYPE i VALUE 300,
c_radius_rate TYPE i VALUE 15,
c_load_rate TYPE i VALUE 5.
TYPES:
BEGIN OF ty_band,
radius_max TYPE i,
max_load TYPE i,
END OF ty_band,
tt_band TYPE STANDARD TABLE OF ty_band WITH EMPTY KEY.
METHODS validate
IMPORTING iv_radius_m TYPE i
iv_load_kg TYPE i
iv_ground TYPE string
RETURNING VALUE(rv_reason) TYPE {{p}}if_crane_hire=>ty_reason.
METHODS max_load
IMPORTING iv_radius_m TYPE i
RETURNING VALUE(rv_load) TYPE i.
METHODS load_chart
RETURNING VALUE(rt_band) TYPE tt_band.
METHODS ground_factor
IMPORTING iv_ground TYPE string
RETURNING VALUE(rv_percent) TYPE i.
METHODS normalize_ground
IMPORTING iv_ground TYPE string
RETURNING VALUE(rv_ground) TYPE string.
METHODS apply_percent
IMPORTING iv_value TYPE i
iv_percent TYPE i
RETURNING VALUE(rv_value) TYPE i.
ENDCLASS.
CLASS {{p}}crane_hire_calc IMPLEMENTATION.
METHOD {{p}}if_crane_hire~hire.
DATA(lv_reason) = validate( iv_radius_m = iv_radius_m
iv_load_kg = iv_load_kg
iv_ground = iv_ground ).
IF lv_reason <> {{p}}if_crane_hire=>c_reason-ok.
rs_result = VALUE #( reason = lv_reason fee = 0 ).
RETURN.
ENDIF.
DATA(lv_base) = iv_radius_m * c_radius_rate + ( iv_load_kg DIV 100 ) * c_load_rate.
DATA(lv_fee) = apply_percent( iv_value = lv_base
iv_percent = ground_factor( iv_ground ) ).
IF iv_permit <> abap_true.
lv_fee = lv_fee + c_permit_fee.
ENDIF.
IF lv_fee < c_min_fee.
lv_fee = c_min_fee.
ENDIF.
rs_result = VALUE #( reason = {{p}}if_crane_hire=>c_reason-ok fee = lv_fee ).
ENDMETHOD.
METHOD validate.
IF iv_radius_m < c_min_radius OR iv_radius_m > c_max_radius.
rv_reason = {{p}}if_crane_hire=>c_reason-radius.
RETURN.
ENDIF.
IF iv_load_kg < c_min_load.
rv_reason = {{p}}if_crane_hire=>c_reason-load.
RETURN.
ENDIF.
IF iv_load_kg > max_load( iv_radius_m ).
rv_reason = {{p}}if_crane_hire=>c_reason-capacity.
RETURN.
ENDIF.
IF ground_factor( iv_ground ) = 0.
rv_reason = {{p}}if_crane_hire=>c_reason-ground.
RETURN.
ENDIF.
rv_reason = {{p}}if_crane_hire=>c_reason-ok.
ENDMETHOD.
METHOD max_load.
DATA(lt_band) = load_chart( ).
LOOP AT lt_band INTO DATA(ls_band).
IF iv_radius_m <= ls_band-radius_max.
rv_load = ls_band-max_load.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD load_chart.
rt_band = VALUE #( ( radius_max = 10 max_load = 12000 )
( radius_max = 20 max_load = 8000 )
( radius_max = 30 max_load = 5000 )
( radius_max = 45 max_load = 3000 )
( radius_max = 60 max_load = 1500 ) ).
ENDMETHOD.
METHOD ground_factor.
CASE normalize_ground( iv_ground ).
WHEN 'ROAD'.
rv_percent = 100.
WHEN 'GRAVEL'.
rv_percent = 115.
WHEN 'SOIL'.
rv_percent = 135.
ENDCASE.
ENDMETHOD.
METHOD normalize_ground.
rv_ground = to_upper( condense( iv_ground ) ).
ENDMETHOD.
METHOD apply_percent.
rv_value = ( iv_value * iv_percent + 50 ) DIV 100.
ENDMETHOD.
ENDCLASS.