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:
174
tasks_gen/train/G1030/faulty/m0_skip_hire_calc.clas.abap
Normal file
174
tasks_gen/train/G1030/faulty/m0_skip_hire_calc.clas.abap
Normal 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.
|
||||
174
tasks_gen/train/G1030/faulty/m1_skip_hire_calc.clas.abap
Normal file
174
tasks_gen/train/G1030/faulty/m1_skip_hire_calc.clas.abap
Normal 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.
|
||||
174
tasks_gen/train/G1030/faulty/m2_skip_hire_calc.clas.abap
Normal file
174
tasks_gen/train/G1030/faulty/m2_skip_hire_calc.clas.abap
Normal 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.
|
||||
174
tasks_gen/train/G1030/faulty/m4_skip_hire_calc.clas.abap
Normal file
174
tasks_gen/train/G1030/faulty/m4_skip_hire_calc.clas.abap
Normal 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.
|
||||
36
tasks_gen/train/G1030/generation.json
Normal file
36
tasks_gen/train/G1030/generation.json
Normal 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
|
||||
}
|
||||
155
tasks_gen/train/G1030/hidden/t61_hidden.clas.abap
Normal file
155
tasks_gen/train/G1030/hidden/t61_hidden.clas.abap
Normal 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.
|
||||
76
tasks_gen/train/G1030/mutation.json
Normal file
76
tasks_gen/train/G1030/mutation.json
Normal 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
|
||||
}
|
||||
174
tasks_gen/train/G1030/reference/skip_hire_calc.clas.abap
Normal file
174
tasks_gen/train/G1030/reference/skip_hire_calc.clas.abap
Normal 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.
|
||||
@@ -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.
|
||||
169
tasks_gen/train/G1030/seed/skip_hire_calc.clas.abap
Normal file
169
tasks_gen/train/G1030/seed/skip_hire_calc.clas.abap
Normal 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.
|
||||
51
tasks_gen/train/G1030/spec.md
Normal file
51
tasks_gen/train/G1030/spec.md
Normal 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.
|
||||
53
tasks_gen/train/G1030/task.json
Normal file
53
tasks_gen/train/G1030/task.json
Normal 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"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user