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.