Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,96 @@
CLASS {{p}}parking_eval DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_park_eval.
PRIVATE SECTION.
TYPES:
ty_amount TYPE p LENGTH 8 DECIMALS 2,
BEGIN OF ty_total,
park_id TYPE {{p}}if_park_eval=>ty_park_id,
session_cnt TYPE i,
total_min TYPE i,
total_fee TYPE ty_amount,
END OF ty_total,
tt_total TYPE HASHED TABLE OF ty_total WITH UNIQUE KEY park_id.
CONSTANTS:
BEGIN OF c_tariff,
a TYPE {{p}}if_park_eval=>ty_tariff VALUE 'A',
b TYPE {{p}}if_park_eval=>ty_tariff VALUE 'B',
c TYPE {{p}}if_park_eval=>ty_tariff VALUE 'C',
END OF c_tariff.
CONSTANTS:
c_free_min TYPE i VALUE 30,
c_max_fee TYPE ty_amount VALUE '20.00',
c_rate_a TYPE ty_amount VALUE '2.00',
c_rate_b TYPE ty_amount VALUE '3.50',
c_rate_c TYPE ty_amount VALUE '5.00'.
METHODS is_valid
IMPORTING is_session TYPE {{p}}if_park_eval=>ty_session
RETURNING VALUE(rv_valid) TYPE abap_bool.
METHODS fee
IMPORTING is_session TYPE {{p}}if_park_eval=>ty_session
RETURNING VALUE(rv_fee) TYPE ty_amount.
METHODS rate
IMPORTING iv_tariff TYPE {{p}}if_park_eval=>ty_tariff
RETURNING VALUE(rv_rate) TYPE ty_amount.
ENDCLASS.
CLASS {{p}}parking_eval IMPLEMENTATION.
METHOD {{p}}if_park_eval~summarize.
DATA lt_total TYPE tt_total.
LOOP AT it_session INTO DATA(ls_session).
IF is_valid( ls_session ) = abap_false.
CONTINUE.
ENDIF.
READ TABLE lt_total WITH TABLE KEY park_id = ls_session-park_id
ASSIGNING FIELD-SYMBOL(<ls_total>).
IF sy-subrc <> 0.
INSERT INITIAL LINE INTO TABLE lt_total ASSIGNING <ls_total>.
<ls_total>-park_id = ls_session-park_id.
ENDIF.
<ls_total>-session_cnt += 1.
<ls_total>-total_min += ls_session-duration_min.
<ls_total>-total_fee += fee( ls_session ).
ENDLOOP.
rt_summary = CORRESPONDING #( lt_total ).
SORT rt_summary BY park_id.
ENDMETHOD.
METHOD is_valid.
rv_valid = xsdbool( is_session-duration_min > 0 AND rate( is_session-tariff ) > 0 ).
ENDMETHOD.
METHOD fee.
IF is_session-duration_min <= c_free_min.
RETURN.
ENDIF.
DATA(lv_hours) = ( is_session-duration_min - c_free_min + 59 ) DIV 60.
rv_fee = lv_hours * rate( is_session-tariff ).
IF rv_fee > c_max_fee.
rv_fee = c_max_fee.
ENDIF.
ENDMETHOD.
METHOD rate.
CASE iv_tariff.
WHEN c_tariff-a.
rv_rate = c_rate_a.
WHEN c_tariff-b.
rv_rate = c_rate_b.
WHEN c_tariff-c.
rv_rate = c_rate_c.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,75 @@
CLASS ltc_parking_eval DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CONSTANTS:
c_fee_000 TYPE p LENGTH 8 DECIMALS 2 VALUE '0.00',
c_fee_200 TYPE p LENGTH 8 DECIMALS 2 VALUE '2.00',
c_fee_2000 TYPE p LENGTH 8 DECIMALS 2 VALUE '20.00'.
DATA mo_cut TYPE REF TO {{p}}if_park_eval.
METHODS setup.
"! @testing {{p}}parking_eval
METHODS free_minutes_are_free FOR TESTING.
"! @testing {{p}}parking_eval
METHODS one_hour_is_charged FOR TESTING.
"! @testing {{p}}parking_eval
METHODS fee_is_capped FOR TESTING.
"! @testing {{p}}parking_eval
METHODS invalid_tariff_is_ignored FOR TESTING.
"! @testing {{p}}parking_eval
METHODS groups_by_park FOR TESTING.
"! @testing {{p}}parking_eval
METHODS empty_input_gives_no_row FOR TESTING.
ENDCLASS.
CLASS ltc_parking_eval IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}parking_eval( ).
ENDMETHOD.
METHOD free_minutes_are_free.
DATA(lt_result) = mo_cut->summarize( VALUE {{p}}if_park_eval=>tt_session(
( park_id = 'P001' tariff = 'A' duration_min = 30 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = c_fee_000 act = lt_result[ 1 ]-total_fee ).
ENDMETHOD.
METHOD one_hour_is_charged.
DATA(lt_result) = mo_cut->summarize( VALUE {{p}}if_park_eval=>tt_session(
( park_id = 'P001' tariff = 'A' duration_min = 31 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = c_fee_200 act = lt_result[ 1 ]-total_fee ).
ENDMETHOD.
METHOD fee_is_capped.
DATA(lt_result) = mo_cut->summarize( VALUE {{p}}if_park_eval=>tt_session(
( park_id = 'P001' tariff = 'C' duration_min = 400 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = c_fee_2000 act = lt_result[ 1 ]-total_fee ).
ENDMETHOD.
METHOD invalid_tariff_is_ignored.
DATA(lt_result) = mo_cut->summarize( VALUE {{p}}if_park_eval=>tt_session(
( park_id = 'P001' tariff = 'X' duration_min = 120 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ).
ENDMETHOD.
METHOD groups_by_park.
DATA(lt_result) = mo_cut->summarize( VALUE {{p}}if_park_eval=>tt_session(
( park_id = 'P002' tariff = 'A' duration_min = 60 )
( park_id = 'P001' tariff = 'A' duration_min = 60 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 'P001' act = lt_result[ 1 ]-park_id ).
cl_abap_unit_assert=>assert_equals( exp = 'P002' act = lt_result[ 2 ]-park_id ).
ENDMETHOD.
METHOD empty_input_gives_no_row.
DATA(lt_result) = mo_cut->summarize( VALUE {{p}}if_park_eval=>tt_session( ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ).
ENDMETHOD.
ENDCLASS.