Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
69 lines
1.8 KiB
ABAP
69 lines
1.8 KiB
ABAP
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.
|