Pipeline controller: plan 2 (hard +, error +50 %), backlog throttle, 2 trajectory workers, stop rules, summaries every 50; budget reserve

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 13:35:54 +02:00
parent 1c4667a0fc
commit 13360292dd
781 changed files with 50211 additions and 22 deletions

View File

@@ -0,0 +1,124 @@
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.

View File

@@ -0,0 +1,104 @@
CLASS ltc_crane_hire DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}if_crane_hire.
METHODS setup.
METHODS road_fee FOR TESTING.
METHODS gravel_fee FOR TESTING.
METHODS soil_fee FOR TESTING.
METHODS permit_fee FOR TESTING.
METHODS minimum_fee FOR TESTING.
METHODS invalid_radius FOR TESTING.
METHODS invalid_load FOR TESTING.
METHODS over_capacity FOR TESTING.
METHODS invalid_ground FOR TESTING.
ENDCLASS.
CLASS ltc_crane_hire IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}crane_hire_calc( ).
ENDMETHOD.
METHOD road_fee.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 20
iv_load_kg = 5000
iv_ground = `ROAD`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_crane_hire=>c_reason-ok
act = ls_result-reason ).
cl_abap_unit_assert=>assert_equals( exp = 550
act = ls_result-fee ).
ENDMETHOD.
METHOD gravel_fee.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 30
iv_load_kg = 5000
iv_ground = `GRAVEL`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = 805
act = ls_result-fee ).
ENDMETHOD.
METHOD soil_fee.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 10
iv_load_kg = 12000
iv_ground = `SOIL`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = 1013
act = ls_result-fee ).
ENDMETHOD.
METHOD permit_fee.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 20
iv_load_kg = 5000
iv_ground = `ROAD`
iv_permit = abap_true ).
cl_abap_unit_assert=>assert_equals( exp = 800
act = ls_result-fee ).
ENDMETHOD.
METHOD minimum_fee.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 5
iv_load_kg = 500
iv_ground = `ROAD`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = 300
act = ls_result-fee ).
ENDMETHOD.
METHOD invalid_radius.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 61
iv_load_kg = 5000
iv_ground = `ROAD`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_crane_hire=>c_reason-radius
act = ls_result-reason ).
ENDMETHOD.
METHOD invalid_load.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 20
iv_load_kg = 499
iv_ground = `ROAD`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_crane_hire=>c_reason-load
act = ls_result-reason ).
ENDMETHOD.
METHOD over_capacity.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 25
iv_load_kg = 6000
iv_ground = `ROAD`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_crane_hire=>c_reason-capacity
act = ls_result-reason ).
ENDMETHOD.
METHOD invalid_ground.
DATA(ls_result) = mo_cut->hire( iv_radius_m = 20
iv_load_kg = 5000
iv_ground = `FIELD`
iv_permit = abap_false ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_crane_hire=>c_reason-ground
act = ls_result-reason ).
ENDMETHOD.
ENDCLASS.