Step F first pass: 81/92 accepted; budget floor 60 calls; rejected slots moved for regeneration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 12:10:52 +02:00
parent d3250acfb8
commit 39769afce8
741 changed files with 40573 additions and 317 deletions

View File

@@ -0,0 +1,68 @@
CLASS {{p}}studio_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES {{p}}if_studio_pricer.
PRIVATE SECTION.
CONSTANTS:
c_discount_per_booking TYPE p LENGTH 5 DECIMALS 2 VALUE '0.75',
c_max_discount TYPE p LENGTH 5 DECIMALS 2 VALUE '15.00'.
METHODS hourly_rate
IMPORTING iv_room TYPE {{p}}if_studio_pricer=>ty_room
RETURNING VALUE(rv_rate) TYPE {{p}}if_studio_pricer=>ty_amount.
METHODS billable_hours
IMPORTING iv_minutes TYPE i
RETURNING VALUE(rv_hours) TYPE i.
METHODS discount_percent
IMPORTING iv_bookings TYPE i
RETURNING VALUE(rv_percent) TYPE i.
ENDCLASS.
CLASS {{p}}studio_pricer IMPLEMENTATION.
METHOD {{p}}if_studio_pricer~calculate.
DATA(lv_rate) = hourly_rate( iv_room ).
IF lv_rate IS INITIAL.
rv_price = 0.
RETURN.
ENDIF.
DATA(lv_base) = lv_rate * billable_hours( iv_minutes ).
DATA(lv_percent) = discount_percent( iv_bookings ).
rv_price = lv_base - lv_base * lv_percent / 100.
ENDMETHOD.
METHOD hourly_rate.
CASE iv_room.
WHEN {{p}}if_studio_pricer=>c_room-a.
rv_rate = '48.00'.
WHEN {{p}}if_studio_pricer=>c_room-b.
rv_rate = '36.00'.
WHEN {{p}}if_studio_pricer=>c_room-c.
rv_rate = '27.00'.
WHEN OTHERS.
rv_rate = 0.
ENDCASE.
ENDMETHOD.
METHOD billable_hours.
rv_hours = ( iv_minutes + 59 ) DIV 60.
IF rv_hours < 1.
rv_hours = 1.
ENDIF.
ENDMETHOD.
METHOD discount_percent.
IF iv_bookings <= 0.
RETURN.
ENDIF.
DATA lv_bookings TYPE p LENGTH 7 DECIMALS 2.
lv_bookings = iv_bookings.
DATA(lv_raw) = lv_bookings * c_discount_per_booking.
IF lv_raw > c_max_discount.
lv_raw = c_max_discount.
ENDIF.
rv_percent = lv_raw.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,76 @@
CLASS ltc_studio_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}studio_pricer.
METHODS setup.
METHODS assert_price
IMPORTING iv_expected TYPE {{p}}if_studio_pricer=>ty_amount
iv_actual TYPE {{p}}if_studio_pricer=>ty_amount.
METHODS room_a_three_hours FOR TESTING.
METHODS started_hour_counts FOR TESTING.
METHODS short_booking_one_hour FOR TESTING.
METHODS invalid_room_returns_zero FOR TESTING.
METHODS discount_five_bookings FOR TESTING.
METHODS discount_is_capped FOR TESTING.
ENDCLASS.
CLASS ltc_studio_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}studio_pricer( ).
ENDMETHOD.
METHOD assert_price.
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ).
ENDMETHOD.
METHOD room_a_three_hours.
assert_price( iv_expected = '144.00'
iv_actual = mo_cut->{{p}}if_studio_pricer~calculate(
iv_room = 'A'
iv_minutes = 180
iv_bookings = 0 ) ).
ENDMETHOD.
METHOD started_hour_counts.
assert_price( iv_expected = '96.00'
iv_actual = mo_cut->{{p}}if_studio_pricer~calculate(
iv_room = 'A'
iv_minutes = 90
iv_bookings = 0 ) ).
ENDMETHOD.
METHOD short_booking_one_hour.
assert_price( iv_expected = '27.00'
iv_actual = mo_cut->{{p}}if_studio_pricer~calculate(
iv_room = 'C'
iv_minutes = 15
iv_bookings = 0 ) ).
ENDMETHOD.
METHOD invalid_room_returns_zero.
assert_price( iv_expected = '0.00'
iv_actual = mo_cut->{{p}}if_studio_pricer~calculate(
iv_room = 'X'
iv_minutes = 60
iv_bookings = 0 ) ).
ENDMETHOD.
METHOD discount_five_bookings.
assert_price( iv_expected = '92.16'
iv_actual = mo_cut->{{p}}if_studio_pricer~calculate(
iv_room = 'A'
iv_minutes = 120
iv_bookings = 5 ) ).
ENDMETHOD.
METHOD discount_is_capped.
assert_price( iv_expected = '30.60'
iv_actual = mo_cut->{{p}}if_studio_pricer~calculate(
iv_room = 'B'
iv_minutes = 30
iv_bookings = 30 ) ).
ENDMETHOD.
ENDCLASS.