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,174 @@
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_size TYPE c LENGTH 6,
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_container,
size TYPE ty_size,
days TYPE i,
hazardous TYPE abap_bool,
permit TYPE abap_bool,
END OF ty_container,
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
METHODS hire_charge
IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS container_charge
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS bulk_discount
IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
PRIVATE SECTION.
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
CONSTANTS c_included_days TYPE i VALUE 7.
CONSTANTS c_min_days TYPE i VALUE 1.
CONSTANTS c_min_containers TYPE i VALUE 5.
CONSTANTS c_percent_bulk TYPE i VALUE 10.
CONSTANTS c_percent_base TYPE i VALUE 100.
METHODS base_price
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_price) TYPE ty_amount.
METHODS day_rate
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_rate) TYPE ty_amount.
METHODS hazard_fee
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS extra_days_fee
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS net_charge
IMPORTING iv_net TYPE ty_amount
iv_count TYPE i
RETURNING VALUE(rv_charge) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
METHOD hire_charge.
DATA lv_net TYPE ty_amount.
DATA lv_count TYPE i.
DATA lv_line TYPE ty_amount.
LOOP AT it_containers INTO DATA(ls_container).
lv_line = container_charge( ls_container ).
IF lv_line > 0.
lv_net = lv_net + lv_line.
lv_count = lv_count - 1.
ENDIF.
ENDLOOP.
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
ENDMETHOD.
METHOD container_charge.
IF is_container-days < c_min_days.
RETURN.
ENDIF.
DATA(lv_base) = base_price( is_container-size ).
IF lv_base = 0.
RETURN.
ENDIF.
rv_charge = lv_base + extra_days_fee( is_container ).
IF is_container-hazardous = abap_true.
rv_charge = rv_charge + hazard_fee( is_container-size ).
ENDIF.
IF is_container-permit = abap_true.
rv_charge = rv_charge + c_permit_fee.
ENDIF.
ENDMETHOD.
METHOD net_charge.
IF iv_net = 0.
RETURN.
ENDIF.
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
/ c_percent_base dec = 2 ).
IF rv_charge < c_min_charge.
rv_charge = c_min_charge.
ENDIF.
ENDMETHOD.
METHOD extra_days_fee.
DATA(lv_days) = is_container-days - c_included_days.
IF lv_days > 0.
rv_fee = day_rate( is_container-size ) * lv_days.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_size.
WHEN c_size_small.
rv_price = c_base_small.
WHEN c_size_medium.
rv_price = c_base_medium.
WHEN c_size_large.
rv_price = c_base_large.
WHEN OTHERS.
rv_price = 0.
ENDCASE.
ENDMETHOD.
METHOD day_rate.
CASE iv_size.
WHEN c_size_small.
rv_rate = c_rate_small.
WHEN c_size_medium.
rv_rate = c_rate_medium.
WHEN c_size_large.
rv_rate = c_rate_large.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD hazard_fee.
CASE iv_size.
WHEN c_size_small.
rv_fee = c_hazard_small.
WHEN c_size_medium.
rv_fee = c_hazard_medium.
WHEN c_size_large.
rv_fee = c_hazard_large.
WHEN OTHERS.
rv_fee = 0.
ENDCASE.
ENDMETHOD.
METHOD bulk_discount.
IF iv_count >= c_min_containers.
rv_percent = c_percent_bulk.
ELSE.
rv_percent = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,174 @@
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_size TYPE c LENGTH 6,
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_container,
size TYPE ty_size,
days TYPE i,
hazardous TYPE abap_bool,
permit TYPE abap_bool,
END OF ty_container,
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
METHODS hire_charge
IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS container_charge
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS bulk_discount
IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
PRIVATE SECTION.
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
CONSTANTS c_included_days TYPE i VALUE 7.
CONSTANTS c_min_days TYPE i VALUE 1.
CONSTANTS c_min_containers TYPE i VALUE 5.
CONSTANTS c_percent_bulk TYPE i VALUE 10.
CONSTANTS c_percent_base TYPE i VALUE 100.
METHODS base_price
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_price) TYPE ty_amount.
METHODS day_rate
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_rate) TYPE ty_amount.
METHODS hazard_fee
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS extra_days_fee
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS net_charge
IMPORTING iv_net TYPE ty_amount
iv_count TYPE i
RETURNING VALUE(rv_charge) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
METHOD hire_charge.
DATA lv_net TYPE ty_amount.
DATA lv_count TYPE i.
DATA lv_line TYPE ty_amount.
LOOP AT it_containers INTO DATA(ls_container).
lv_line = container_charge( ls_container ).
IF lv_line > 0.
lv_net = lv_net + lv_line.
lv_count = lv_count + 1.
ENDIF.
ENDLOOP.
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
ENDMETHOD.
METHOD container_charge.
IF is_container-days < c_min_days.
RETURN.
ENDIF.
DATA(lv_base) = base_price( is_container-size ).
IF lv_base = 0.
RETURN.
ENDIF.
rv_charge = lv_base + extra_days_fee( is_container ).
IF is_container-hazardous = abap_true.
rv_charge = rv_charge + hazard_fee( is_container-size ).
ENDIF.
IF is_container-permit = abap_false.
rv_charge = rv_charge + c_permit_fee.
ENDIF.
ENDMETHOD.
METHOD net_charge.
IF iv_net = 0.
RETURN.
ENDIF.
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
/ c_percent_base dec = 2 ).
IF rv_charge < c_min_charge.
rv_charge = c_min_charge.
ENDIF.
ENDMETHOD.
METHOD extra_days_fee.
DATA(lv_days) = is_container-days - c_included_days.
IF lv_days > 0.
rv_fee = day_rate( is_container-size ) * lv_days.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_size.
WHEN c_size_small.
rv_price = c_base_small.
WHEN c_size_medium.
rv_price = c_base_medium.
WHEN c_size_large.
rv_price = c_base_large.
WHEN OTHERS.
rv_price = 0.
ENDCASE.
ENDMETHOD.
METHOD day_rate.
CASE iv_size.
WHEN c_size_small.
rv_rate = c_rate_small.
WHEN c_size_medium.
rv_rate = c_rate_medium.
WHEN c_size_large.
rv_rate = c_rate_large.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD hazard_fee.
CASE iv_size.
WHEN c_size_small.
rv_fee = c_hazard_small.
WHEN c_size_medium.
rv_fee = c_hazard_medium.
WHEN c_size_large.
rv_fee = c_hazard_large.
WHEN OTHERS.
rv_fee = 0.
ENDCASE.
ENDMETHOD.
METHOD bulk_discount.
IF iv_count >= c_min_containers.
rv_percent = c_percent_bulk.
ELSE.
rv_percent = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,174 @@
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_size TYPE c LENGTH 6,
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_container,
size TYPE ty_size,
days TYPE i,
hazardous TYPE abap_bool,
permit TYPE abap_bool,
END OF ty_container,
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
METHODS hire_charge
IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS container_charge
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS bulk_discount
IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
PRIVATE SECTION.
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
CONSTANTS c_included_days TYPE i VALUE 7.
CONSTANTS c_min_days TYPE i VALUE 1.
CONSTANTS c_min_containers TYPE i VALUE 5.
CONSTANTS c_percent_bulk TYPE i VALUE 10.
CONSTANTS c_percent_base TYPE i VALUE 100.
METHODS base_price
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_price) TYPE ty_amount.
METHODS day_rate
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_rate) TYPE ty_amount.
METHODS hazard_fee
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS extra_days_fee
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS net_charge
IMPORTING iv_net TYPE ty_amount
iv_count TYPE i
RETURNING VALUE(rv_charge) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
METHOD hire_charge.
DATA lv_net TYPE ty_amount.
DATA lv_count TYPE i.
DATA lv_line TYPE ty_amount.
LOOP AT it_containers INTO DATA(ls_container).
lv_line = container_charge( ls_container ).
IF lv_line > 0.
lv_net = lv_net + lv_line.
lv_count = lv_count + 1.
ENDIF.
ENDLOOP.
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
ENDMETHOD.
METHOD container_charge.
IF is_container-days < c_min_days.
RETURN.
ENDIF.
DATA(lv_base) = base_price( is_container-size ).
IF lv_base = 0.
RETURN.
ENDIF.
rv_charge = lv_base + extra_days_fee( is_container ).
IF is_container-hazardous = abap_true.
rv_charge = rv_charge + hazard_fee( is_container-size ).
ENDIF.
IF is_container-permit = abap_true.
rv_charge = rv_charge + c_permit_fee.
ENDIF.
ENDMETHOD.
METHOD net_charge.
IF iv_net <> 0.
RETURN.
ENDIF.
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
/ c_percent_base dec = 2 ).
IF rv_charge < c_min_charge.
rv_charge = c_min_charge.
ENDIF.
ENDMETHOD.
METHOD extra_days_fee.
DATA(lv_days) = is_container-days - c_included_days.
IF lv_days > 0.
rv_fee = day_rate( is_container-size ) * lv_days.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_size.
WHEN c_size_small.
rv_price = c_base_small.
WHEN c_size_medium.
rv_price = c_base_medium.
WHEN c_size_large.
rv_price = c_base_large.
WHEN OTHERS.
rv_price = 0.
ENDCASE.
ENDMETHOD.
METHOD day_rate.
CASE iv_size.
WHEN c_size_small.
rv_rate = c_rate_small.
WHEN c_size_medium.
rv_rate = c_rate_medium.
WHEN c_size_large.
rv_rate = c_rate_large.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD hazard_fee.
CASE iv_size.
WHEN c_size_small.
rv_fee = c_hazard_small.
WHEN c_size_medium.
rv_fee = c_hazard_medium.
WHEN c_size_large.
rv_fee = c_hazard_large.
WHEN OTHERS.
rv_fee = 0.
ENDCASE.
ENDMETHOD.
METHOD bulk_discount.
IF iv_count >= c_min_containers.
rv_percent = c_percent_bulk.
ELSE.
rv_percent = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,174 @@
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_size TYPE c LENGTH 6,
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_container,
size TYPE ty_size,
days TYPE i,
hazardous TYPE abap_bool,
permit TYPE abap_bool,
END OF ty_container,
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
METHODS hire_charge
IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS container_charge
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS bulk_discount
IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
PRIVATE SECTION.
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
CONSTANTS c_included_days TYPE i VALUE 7.
CONSTANTS c_min_days TYPE i VALUE 1.
CONSTANTS c_min_containers TYPE i VALUE 5.
CONSTANTS c_percent_bulk TYPE i VALUE 10.
CONSTANTS c_percent_base TYPE i VALUE 100.
METHODS base_price
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_price) TYPE ty_amount.
METHODS day_rate
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_rate) TYPE ty_amount.
METHODS hazard_fee
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS extra_days_fee
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS net_charge
IMPORTING iv_net TYPE ty_amount
iv_count TYPE i
RETURNING VALUE(rv_charge) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
METHOD hire_charge.
DATA lv_net TYPE ty_amount.
DATA lv_count TYPE i.
DATA lv_line TYPE ty_amount.
LOOP AT it_containers INTO DATA(ls_container).
lv_line = container_charge( ls_container ).
IF lv_line > 0.
lv_net = lv_net + lv_line.
lv_count = lv_count + 1.
ENDIF.
ENDLOOP.
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
ENDMETHOD.
METHOD container_charge.
IF is_container-days < c_min_days.
RETURN.
ENDIF.
DATA(lv_base) = base_price( is_container-size ).
IF lv_base = 0.
RETURN.
ENDIF.
rv_charge = lv_base + extra_days_fee( is_container ).
IF is_container-hazardous = abap_true.
rv_charge = rv_charge + hazard_fee( is_container-size ).
ENDIF.
IF is_container-permit = abap_true.
rv_charge = rv_charge + c_permit_fee.
ENDIF.
ENDMETHOD.
METHOD net_charge.
IF iv_net = 0.
RETURN.
ENDIF.
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
/ c_percent_base dec = 2 ).
IF rv_charge >= c_min_charge.
rv_charge = c_min_charge.
ENDIF.
ENDMETHOD.
METHOD extra_days_fee.
DATA(lv_days) = is_container-days - c_included_days.
IF lv_days > 0.
rv_fee = day_rate( is_container-size ) * lv_days.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_size.
WHEN c_size_small.
rv_price = c_base_small.
WHEN c_size_medium.
rv_price = c_base_medium.
WHEN c_size_large.
rv_price = c_base_large.
WHEN OTHERS.
rv_price = 0.
ENDCASE.
ENDMETHOD.
METHOD day_rate.
CASE iv_size.
WHEN c_size_small.
rv_rate = c_rate_small.
WHEN c_size_medium.
rv_rate = c_rate_medium.
WHEN c_size_large.
rv_rate = c_rate_large.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD hazard_fee.
CASE iv_size.
WHEN c_size_small.
rv_fee = c_hazard_small.
WHEN c_size_medium.
rv_fee = c_hazard_medium.
WHEN c_size_large.
rv_fee = c_hazard_large.
WHEN OTHERS.
rv_fee = 0.
ENDCASE.
ENDMETHOD.
METHOD bulk_discount.
IF iv_count >= c_min_containers.
rv_percent = c_percent_bulk.
ELSE.
rv_percent = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,36 @@
{
"id": "G1030",
"pool": "train",
"object_type": "CLAS",
"category": "E",
"attempts": [
{
"stage": "bundle",
"errors": [
"reference/tailor_pricer.clas.abap line 52: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"METHODS\"",
"Too close to task G1002 (similarity spec 0.69, rules 0.62, names 0.33). Choose a different business topic and different object names.",
"Too close to task G1010 (similarity spec 0.57, rules 0.64, names 0.25). Choose a different business topic and different object names."
],
"by_check": {
"abaplint": 1,
"extra": 2
}
},
{
"stage": "validate",
"oracle": 65.8,
"null": 0
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 4,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,155 @@
CLASS {{p}}t61_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}skip_hire_calc.
METHODS setup.
METHODS empty_order_is_zero FOR TESTING.
METHODS small_order_minimum FOR TESTING.
METHODS base_prices_by_size FOR TESTING.
METHODS seven_days_included FOR TESTING.
METHODS extra_days_charged FOR TESTING.
METHODS hazardous_surcharge FOR TESTING.
METHODS permit_fee FOR TESTING.
METHODS invalid_containers_ignored FOR TESTING.
METHODS bulk_discount_five FOR TESTING.
METHODS discount_needs_five_valid FOR TESTING.
METHODS container_charge_direct FOR TESTING.
METHODS discount_boundaries FOR TESTING.
ENDCLASS.
CLASS {{p}}t61_hidden IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}skip_hire_calc( ).
ENDMETHOD.
METHOD empty_order_is_zero.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers( ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '0.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD small_order_minimum.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '120.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD base_prices_by_size.
DATA(lt_medium) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'MEDIUM' days = 1 hazardous = abap_false permit = abap_false ) ).
DATA(lt_large) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'LARGE' days = 1 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '140.00' )
act = mo_cut->hire_charge( lt_medium ) msg = `MEDIUM` ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '200.00' )
act = mo_cut->hire_charge( lt_large ) msg = `LARGE` ).
ENDMETHOD.
METHOD seven_days_included.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'MEDIUM' days = 7 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '140.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD extra_days_charged.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'MEDIUM' days = 10 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '176.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD hazardous_surcharge.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_true permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '150.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD permit_fee.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_true ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '135.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD invalid_containers_ignored.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'HUGE' days = 3 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 0 hazardous = abap_false permit = abap_false )
( size = 'LARGE' days = -2 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '0.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD bulk_discount_five.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '405.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD discount_needs_five_valid.
DATA(lt_four) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false ) ).
DATA(lt_with_invalid) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false )
( size = 'HUGE' days = 5 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '360.00' )
act = mo_cut->hire_charge( lt_four ) msg = `four containers` ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '360.00' )
act = mo_cut->hire_charge( lt_with_invalid ) msg = `invalid row not counted` ).
ENDMETHOD.
METHOD container_charge_direct.
DATA(ls_small) = VALUE {{p}}skip_hire_calc=>ty_container(
size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false ).
DATA(ls_large) = VALUE {{p}}skip_hire_calc=>ty_container(
size = 'LARGE' days = 10 hazardous = abap_false permit = abap_false ).
DATA(ls_no_days) = VALUE {{p}}skip_hire_calc=>ty_container(
size = 'MEDIUM' days = 0 hazardous = abap_false permit = abap_false ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '90.00' )
act = mo_cut->container_charge( ls_small ) msg = `SMALL one day` ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '248.00' )
act = mo_cut->container_charge( ls_large ) msg = `LARGE ten days` ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '0.00' )
act = mo_cut->container_charge( ls_no_days ) msg = `no days` ).
ENDMETHOD.
METHOD discount_boundaries.
cl_abap_unit_assert=>assert_equals( exp = 0 act = mo_cut->bulk_discount( 0 ) msg = `none` ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = mo_cut->bulk_discount( 4 ) msg = `four` ).
cl_abap_unit_assert=>assert_equals( exp = 10 act = mo_cut->bulk_discount( 5 ) msg = `five` ).
cl_abap_unit_assert=>assert_equals( exp = 10 act = mo_cut->bulk_discount( 9 ) msg = `nine` ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,76 @@
{
"task": "G1030",
"mutants": [
{
"object": "{{P}}SKIP_HIRE_CALC",
"mutant": "line 85: + -> - (arith)",
"status": "killed",
"hidden": "11/12",
"failed_tests": [
"BULK_DISCOUNT_FIVE"
]
},
{
"object": "{{P}}SKIP_HIRE_CALC",
"mutant": "line 104: abap_true -> abap_false (bool)",
"status": "killed",
"hidden": "3/12",
"failed_tests": [
"BASE_PRICES_BY_SIZE",
"BULK_DISCOUNT_FIVE",
"CONTAINER_CHARGE_DIRECT",
"DISCOUNT_NEEDS_FIVE_VALID",
"EXTRA_DAYS_CHARGED",
"HAZARDOUS_SURCHARGE",
"PERMIT_FEE",
"SEVEN_DAYS_INCLUDED",
"SMALL_ORDER_MINIMUM"
]
},
{
"object": "{{P}}SKIP_HIRE_CALC",
"mutant": "line 110: = -> <> (eq)",
"status": "killed",
"hidden": "2/12",
"failed_tests": [
"BASE_PRICES_BY_SIZE",
"BULK_DISCOUNT_FIVE",
"DISCOUNT_NEEDS_FIVE_VALID",
"EMPTY_ORDER_IS_ZERO",
"EXTRA_DAYS_CHARGED",
"HAZARDOUS_SURCHARGE",
"INVALID_CONTAINERS_IGNORED",
"PERMIT_FEE",
"SEVEN_DAYS_INCLUDED",
"SMALL_ORDER_MINIMUM"
]
},
{
"object": "{{P}}SKIP_HIRE_CALC",
"mutant": "line 114: 2 -> 3 (const)",
"status": "survived",
"hidden": "12/12",
"failed_tests": []
},
{
"object": "{{P}}SKIP_HIRE_CALC",
"mutant": "line 115: < -> >= (rel)",
"status": "killed",
"hidden": "4/12",
"failed_tests": [
"BASE_PRICES_BY_SIZE",
"BULK_DISCOUNT_FIVE",
"DISCOUNT_NEEDS_FIVE_VALID",
"EXTRA_DAYS_CHARGED",
"HAZARDOUS_SURCHARGE",
"PERMIT_FEE",
"SEVEN_DAYS_INCLUDED",
"SMALL_ORDER_MINIMUM"
]
}
],
"valid": 5,
"killed": 4,
"kill_rate": 0.8,
"ok": true
}

View File

@@ -0,0 +1,174 @@
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_size TYPE c LENGTH 6,
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_container,
size TYPE ty_size,
days TYPE i,
hazardous TYPE abap_bool,
permit TYPE abap_bool,
END OF ty_container,
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
METHODS hire_charge
IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS container_charge
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS bulk_discount
IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
PRIVATE SECTION.
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
CONSTANTS c_included_days TYPE i VALUE 7.
CONSTANTS c_min_days TYPE i VALUE 1.
CONSTANTS c_min_containers TYPE i VALUE 5.
CONSTANTS c_percent_bulk TYPE i VALUE 10.
CONSTANTS c_percent_base TYPE i VALUE 100.
METHODS base_price
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_price) TYPE ty_amount.
METHODS day_rate
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_rate) TYPE ty_amount.
METHODS hazard_fee
IMPORTING iv_size TYPE ty_size
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS extra_days_fee
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS net_charge
IMPORTING iv_net TYPE ty_amount
iv_count TYPE i
RETURNING VALUE(rv_charge) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
METHOD hire_charge.
DATA lv_net TYPE ty_amount.
DATA lv_count TYPE i.
DATA lv_line TYPE ty_amount.
LOOP AT it_containers INTO DATA(ls_container).
lv_line = container_charge( ls_container ).
IF lv_line > 0.
lv_net = lv_net + lv_line.
lv_count = lv_count + 1.
ENDIF.
ENDLOOP.
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
ENDMETHOD.
METHOD container_charge.
IF is_container-days < c_min_days.
RETURN.
ENDIF.
DATA(lv_base) = base_price( is_container-size ).
IF lv_base = 0.
RETURN.
ENDIF.
rv_charge = lv_base + extra_days_fee( is_container ).
IF is_container-hazardous = abap_true.
rv_charge = rv_charge + hazard_fee( is_container-size ).
ENDIF.
IF is_container-permit = abap_true.
rv_charge = rv_charge + c_permit_fee.
ENDIF.
ENDMETHOD.
METHOD net_charge.
IF iv_net = 0.
RETURN.
ENDIF.
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
/ c_percent_base dec = 2 ).
IF rv_charge < c_min_charge.
rv_charge = c_min_charge.
ENDIF.
ENDMETHOD.
METHOD extra_days_fee.
DATA(lv_days) = is_container-days - c_included_days.
IF lv_days > 0.
rv_fee = day_rate( is_container-size ) * lv_days.
ENDIF.
ENDMETHOD.
METHOD base_price.
CASE iv_size.
WHEN c_size_small.
rv_price = c_base_small.
WHEN c_size_medium.
rv_price = c_base_medium.
WHEN c_size_large.
rv_price = c_base_large.
WHEN OTHERS.
rv_price = 0.
ENDCASE.
ENDMETHOD.
METHOD day_rate.
CASE iv_size.
WHEN c_size_small.
rv_rate = c_rate_small.
WHEN c_size_medium.
rv_rate = c_rate_medium.
WHEN c_size_large.
rv_rate = c_rate_large.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD hazard_fee.
CASE iv_size.
WHEN c_size_small.
rv_fee = c_hazard_small.
WHEN c_size_medium.
rv_fee = c_hazard_medium.
WHEN c_size_large.
rv_fee = c_hazard_large.
WHEN OTHERS.
rv_fee = 0.
ENDCASE.
ENDMETHOD.
METHOD bulk_discount.
IF iv_count >= c_min_containers.
rv_percent = c_percent_bulk.
ELSE.
rv_percent = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,65 @@
CLASS ltc_skip_hire_calc DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}skip_hire_calc.
METHODS setup.
METHODS minimum_charge_applies FOR TESTING.
METHODS extra_days_are_charged FOR TESTING.
METHODS hazardous_and_permit FOR TESTING.
METHODS bulk_discount FOR TESTING.
METHODS invalid_rows_are_free FOR TESTING.
ENDCLASS.
CLASS ltc_skip_hire_calc IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}skip_hire_calc( ).
ENDMETHOD.
METHOD minimum_charge_applies.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '120.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD extra_days_are_charged.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'MEDIUM' days = 10 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '176.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD hazardous_and_permit.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'SMALL' days = 1 hazardous = abap_true permit = abap_true ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '195.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD bulk_discount.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'MEDIUM' days = 1 hazardous = abap_false permit = abap_false )
( size = 'MEDIUM' days = 1 hazardous = abap_false permit = abap_false )
( size = 'MEDIUM' days = 1 hazardous = abap_false permit = abap_false )
( size = 'MEDIUM' days = 1 hazardous = abap_false permit = abap_false )
( size = 'MEDIUM' days = 1 hazardous = abap_false permit = abap_false ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '630.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
METHOD invalid_rows_are_free.
DATA(lt_containers) = VALUE {{p}}skip_hire_calc=>tt_containers(
( size = 'HUGE' days = 3 hazardous = abap_true permit = abap_true ) ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}skip_hire_calc=>ty_amount( '0.00' )
act = mo_cut->hire_charge( lt_containers ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,169 @@
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_size TYPE c LENGTH 6,
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_container,
size TYPE ty_size,
days TYPE i,
hazardous TYPE abap_bool,
permit TYPE abap_bool,
END OF ty_container,
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
METHODS hire_charge
IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS container_charge
IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
METHODS bulk_discount
IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
ENDCLASS.
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
METHOD hire_charge.
DATA: lv_net TYPE ty_amount,
lv_pct TYPE i,
lv_count TYPE i,
lv_base TYPE ty_amount,
lv_rate TYPE ty_amount,
lv_extra TYPE ty_amount,
lv_days TYPE i,
ls_container TYPE ty_container.
CLEAR rv_charge.
LOOP AT it_containers INTO ls_container.
CLEAR lv_base.
CLEAR lv_rate.
IF ls_container-size = 'SMALL'.
lv_base = '90.00'.
lv_rate = '8.00'.
ELSEIF ls_container-size = 'MEDIUM'.
lv_base = '140.00'.
lv_rate = '12.00'.
ELSEIF ls_container-size = 'LARGE'.
lv_base = '200.00'.
lv_rate = '16.00'.
ENDIF.
IF lv_base > 0 AND ls_container-days >= 1.
CLEAR lv_extra.
lv_days = ls_container-days - 7.
IF lv_days > 0.
lv_extra = lv_rate * lv_days.
ENDIF.
lv_net = lv_net + lv_base + lv_extra.
lv_count = lv_count + 1.
IF ls_container-hazardous = abap_true.
IF ls_container-size = 'SMALL'.
lv_net = lv_net + '60.00'.
ELSEIF ls_container-size = 'MEDIUM'.
lv_net = lv_net + '80.00'.
ELSE.
lv_net = lv_net + '100.00'.
ENDIF.
ENDIF.
IF ls_container-permit = abap_true.
lv_net = lv_net + '45.00'.
ENDIF.
ENDIF.
ENDLOOP.
IF lv_net = 0.
RETURN.
ENDIF.
IF lv_count >= 5.
lv_pct = 10.
ELSE.
lv_pct = 0.
ENDIF.
rv_charge = lv_net * ( 100 - lv_pct ) / 100.
rv_charge = round( val = rv_charge dec = 2 ).
IF rv_charge < 120.
rv_charge = 120.
ENDIF.
ENDMETHOD.
METHOD container_charge.
DATA: lv_base TYPE ty_amount,
lv_rate TYPE ty_amount,
lv_extra TYPE ty_amount,
lv_days TYPE i.
CLEAR rv_charge.
IF is_container-size = 'SMALL'.
lv_base = '90.00'.
lv_rate = '8.00'.
ELSEIF is_container-size = 'MEDIUM'.
lv_base = '140.00'.
lv_rate = '12.00'.
ELSEIF is_container-size = 'LARGE'.
lv_base = '200.00'.
lv_rate = '16.00'.
ELSE.
RETURN.
ENDIF.
IF is_container-days < 1.
RETURN.
ENDIF.
lv_days = is_container-days - 7.
IF lv_days > 0.
lv_extra = lv_rate * lv_days.
ENDIF.
rv_charge = lv_base + lv_extra.
IF is_container-hazardous = abap_true.
IF is_container-size = 'SMALL'.
rv_charge = rv_charge + '60.00'.
ELSEIF is_container-size = 'MEDIUM'.
rv_charge = rv_charge + '80.00'.
ELSE.
rv_charge = rv_charge + '100.00'.
ENDIF.
ENDIF.
IF is_container-permit = abap_true.
rv_charge = rv_charge + '45.00'.
ENDIF.
ENDMETHOD.
METHOD bulk_discount.
IF iv_count >= 5.
rv_percent = 10.
ELSE.
rv_percent = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,51 @@
# 1. Goal
A waste container hire company rents skips to its customers. The depot terminal
calls the class {{P}}SKIP_HIRE_CALC for each hire order. The class is legacy
code. Refactor the class. The behavior must stay the same.
# 2. Open questions
None.
# 3. Context
- The class {{P}}SKIP_HIRE_CALC exists in package $TMP. It is active.
- The class is public and final. It has a public constructor without parameters.
- The legacy implementation is hard to read. It has a long method, deep nesting,
duplicated logic, and unnamed numbers.
- The depot terminal calls the class. The result of a call must not change.
# 4. Contract
- Refactor the class {{P}}SKIP_HIRE_CALC in package $TMP. The name of the class
stays the same. The class stays public and final and keeps a public
constructor without parameters.
- Keep the public interface. Do not change a name and do not change a type:
- TYPES ty_size TYPE c LENGTH 6.
- TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
- TYPES BEGIN OF ty_container. Components: size TYPE ty_size, days TYPE i,
hazardous TYPE abap_bool, permit TYPE abap_bool. END OF ty_container.
- TYPES tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
- METHOD hire_charge IMPORTING it_containers TYPE tt_containers
RETURNING VALUE(rv_charge) TYPE ty_amount.
- METHOD container_charge IMPORTING is_container TYPE ty_container
RETURNING VALUE(rv_charge) TYPE ty_amount.
- METHOD bulk_discount IMPORTING iv_count TYPE i
RETURNING VALUE(rv_percent) TYPE i.
- Do not add other public methods.
# 5. Business rules
- The behavior of the class must stay the same for every input.
- The legacy implementation in the seed defines the behavior. Read the legacy
code. The legacy code contains all the rules of the calculation.
- Do not change the result of a call.
# 6. Constraints
- Release target: SAP_BASIS 816 (ABAP Platform 2025).
- Coding standards: Clean ABAP. Methods below 40 statements. No deep nesting.
No duplicated logic. Replace each unnamed number with a named constant. Use
modern ABAP syntax. No global variable. No comment that restates the code.
- Out of scope: do not create new objects. Do not change other objects.
# 7. Acceptance
- The class {{P}}SKIP_HIRE_CALC is active and has no syntax error.
- The behavior of the class is unchanged.
- The hidden tests pass.
- Write your own ABAP Unit tests for the class.

View File

@@ -0,0 +1,53 @@
{
"id": "G1030",
"category": "E",
"object_type": "CLAS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 80,
"max_activations": 20
},
"seed": [
{
"type": "CLAS",
"name": "{{P}}SKIP_HIRE_CALC",
"file": "seed/skip_hire_calc.clas.abap",
"description": "Legacy waste container hire calculator: long nested method, duplicated per-container logic, unnamed numbers"
}
],
"contract": [
{
"type": "CLAS",
"name": "{{P}}SKIP_HIRE_CALC"
}
],
"out_of_scope": [
"Create new objects",
"Change objects other than {{P}}SKIP_HIRE_CALC"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T61_HIDDEN",
"file": "hidden/t61_hidden.clas.abap",
"description": "T61 hidden tests for the unchanged behavior of the waste container hire calculation"
}
],
"reference": [
{
"type": "CLAS",
"name": "{{P}}SKIP_HIRE_CALC",
"file": "reference/skip_hire_calc.clas.abap",
"description": "Refactored waste container hire calculator",
"testclasses_file": "reference/skip_hire_calc.testclasses.abap"
}
],
"craft_checks": [
"method_length",
"magic_numbers",
"nesting_depth",
"duplication"
]
}