146 lines
4.2 KiB
ABAP
146 lines
4.2 KiB
ABAP
CLASS {{p}}pool_ticket DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES ty_zone TYPE c LENGTH 2.
|
|
TYPES ty_rate TYPE c LENGTH 1.
|
|
TYPES ty_day TYPE c LENGTH 2.
|
|
TYPES ty_flag TYPE c LENGTH 1.
|
|
TYPES ty_status TYPE c LENGTH 2.
|
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
|
|
|
CONSTANTS:
|
|
BEGIN OF c_status,
|
|
ok TYPE ty_status VALUE 'OK',
|
|
zone TYPE ty_status VALUE 'ZN',
|
|
rate TYPE ty_status VALUE 'RT',
|
|
day TYPE ty_status VALUE 'DY',
|
|
END OF c_status.
|
|
|
|
CONSTANTS:
|
|
BEGIN OF c_flag,
|
|
member TYPE ty_flag VALUE 'X',
|
|
guest TYPE ty_flag VALUE ' ',
|
|
END OF c_flag.
|
|
|
|
METHODS check_booking
|
|
IMPORTING iv_zone TYPE ty_zone
|
|
iv_rate TYPE ty_rate
|
|
iv_day TYPE ty_day
|
|
RETURNING VALUE(rv_status) TYPE ty_status.
|
|
|
|
METHODS ticket_price
|
|
IMPORTING iv_zone TYPE ty_zone
|
|
iv_rate TYPE ty_rate
|
|
iv_day TYPE ty_day
|
|
iv_member TYPE ty_flag
|
|
RETURNING VALUE(rv_price) TYPE ty_amount.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES:
|
|
BEGIN OF ty_base_price,
|
|
zone TYPE ty_zone,
|
|
rate TYPE ty_rate,
|
|
base TYPE ty_amount,
|
|
END OF ty_base_price,
|
|
tt_base_price TYPE HASHED TABLE OF ty_base_price WITH UNIQUE KEY zone rate.
|
|
|
|
CONSTANTS c_weekend_surcharge TYPE ty_amount VALUE '2.50'.
|
|
CONSTANTS c_member_share TYPE i VALUE 80.
|
|
|
|
METHODS base_prices
|
|
RETURNING VALUE(rt_price) TYPE tt_base_price.
|
|
|
|
METHODS weekend_surcharge
|
|
IMPORTING iv_day TYPE ty_day
|
|
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
|
|
|
METHODS is_known_zone
|
|
IMPORTING iv_zone TYPE ty_zone
|
|
RETURNING VALUE(rv_known) TYPE abap_bool.
|
|
|
|
METHODS is_known_rate
|
|
IMPORTING iv_rate TYPE ty_rate
|
|
RETURNING VALUE(rv_known) TYPE abap_bool.
|
|
|
|
METHODS is_known_day
|
|
IMPORTING iv_day TYPE ty_day
|
|
RETURNING VALUE(rv_known) TYPE abap_bool.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}pool_ticket IMPLEMENTATION.
|
|
METHOD check_booking.
|
|
IF is_known_zone( iv_zone ) = abap_false.
|
|
rv_status = c_status-zone.
|
|
RETURN.
|
|
ENDIF.
|
|
IF is_known_rate( iv_rate ) = abap_false.
|
|
rv_status = c_status-rate.
|
|
RETURN.
|
|
ENDIF.
|
|
IF is_known_day( iv_day ) = abap_false.
|
|
rv_status = c_status-day.
|
|
RETURN.
|
|
ENDIF.
|
|
rv_status = c_status-ok.
|
|
ENDMETHOD.
|
|
|
|
METHOD ticket_price.
|
|
IF check_booking( iv_zone = iv_zone
|
|
iv_rate = iv_rate
|
|
iv_day = iv_day ) <> c_status-ok.
|
|
rv_price = 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
DATA(lt_price) = base_prices( ).
|
|
READ TABLE lt_price INTO DATA(ls_price)
|
|
WITH TABLE KEY zone = iv_zone rate = iv_rate.
|
|
IF sy-subrc <> 0.
|
|
rv_price = 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
rv_price = ls_price-base + weekend_surcharge( iv_day ).
|
|
IF iv_member = c_flag-member.
|
|
rv_price = rv_price * c_member_share / 100.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD base_prices.
|
|
rt_price = VALUE #(
|
|
( zone = 'IN' rate = 'A' base = '10.00' )
|
|
( zone = 'IN' rate = 'C' base = '5.00' )
|
|
( zone = 'IN' rate = 'S' base = '7.50' )
|
|
( zone = 'OU' rate = 'A' base = '7.50' )
|
|
( zone = 'OU' rate = 'C' base = '3.75' )
|
|
( zone = 'OU' rate = 'S' base = '5.00' )
|
|
( zone = 'SA' rate = 'A' base = '15.00' )
|
|
( zone = 'SA' rate = 'C' base = '7.50' )
|
|
( zone = 'SA' rate = 'S' base = '11.25' )
|
|
( zone = 'AL' rate = 'A' base = '20.00' )
|
|
( zone = 'AL' rate = 'C' base = '10.00' )
|
|
( zone = 'AL' rate = 'S' base = '15.00' ) ).
|
|
ENDMETHOD.
|
|
|
|
METHOD weekend_surcharge.
|
|
IF iv_day = 'SA' OR iv_day = 'SU'.
|
|
rv_surcharge = c_weekend_surcharge.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD is_known_zone.
|
|
rv_known = xsdbool( iv_zone = 'IN' OR iv_zone = 'OU'
|
|
OR iv_zone = 'SA' OR iv_zone = 'AL' ).
|
|
ENDMETHOD.
|
|
|
|
METHOD is_known_rate.
|
|
rv_known = xsdbool( iv_rate = 'A' OR iv_rate = 'C' OR iv_rate = 'S' ).
|
|
ENDMETHOD.
|
|
|
|
METHOD is_known_day.
|
|
rv_known = xsdbool( iv_day = 'MO' OR iv_day = 'TU' OR iv_day = 'WE'
|
|
OR iv_day = 'TH' OR iv_day = 'FR' OR iv_day = 'SA'
|
|
OR iv_day = 'SU' ).
|
|
ENDMETHOD.
|
|
ENDCLASS.
|