CLASS {{p}}cinema_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_cinema_price. PRIVATE SECTION. CONSTANTS: c_late_surcharge TYPE {{p}}if_cinema_price=>ty_amount VALUE '1.50', c_late_hour TYPE i VALUE 20, c_group_limit TYPE i VALUE 6, c_group_percent TYPE i VALUE 10, c_loyalty_pct TYPE i VALUE 5, c_max_tickets TYPE i VALUE 20, c_max_hour TYPE i VALUE 23. METHODS is_known_screen IMPORTING iv_screen TYPE {{p}}if_cinema_price=>ty_screen RETURNING VALUE(rv_known) TYPE abap_bool. METHODS is_known_visitor IMPORTING iv_visitor TYPE {{p}}if_cinema_price=>ty_visitor RETURNING VALUE(rv_known) TYPE abap_bool. METHODS base_price IMPORTING iv_screen TYPE {{p}}if_cinema_price=>ty_screen RETURNING VALUE(rv_price) TYPE {{p}}if_cinema_price=>ty_amount. METHODS discount_percent IMPORTING iv_visitor TYPE {{p}}if_cinema_price=>ty_visitor RETURNING VALUE(rv_percent) TYPE i. METHODS ticket_price IMPORTING iv_screen TYPE {{p}}if_cinema_price=>ty_screen iv_visitor TYPE {{p}}if_cinema_price=>ty_visitor iv_show_hour TYPE i RETURNING VALUE(rv_price) TYPE {{p}}if_cinema_price=>ty_amount. ENDCLASS. CLASS {{p}}cinema_pricer IMPLEMENTATION. METHOD {{p}}if_cinema_price~price. IF is_known_screen( iv_screen ) = abap_false. rs_result-reason = {{p}}if_cinema_price=>c_reason-screen. RETURN. ENDIF. IF is_known_visitor( iv_visitor ) = abap_false. rs_result-reason = {{p}}if_cinema_price=>c_reason-visitor. RETURN. ENDIF. IF iv_quantity < 1 OR iv_quantity > c_max_tickets. rs_result-reason = {{p}}if_cinema_price=>c_reason-quantity. RETURN. ENDIF. IF iv_show_hour < 0 OR iv_show_hour > c_max_hour. rs_result-reason = {{p}}if_cinema_price=>c_reason-hour. RETURN. ENDIF. DATA lv_total TYPE {{p}}if_cinema_price=>ty_amount. lv_total = ticket_price( iv_screen = iv_screen iv_visitor = iv_visitor iv_show_hour = iv_show_hour ) * iv_quantity. IF iv_quantity >= c_group_limit. lv_total = lv_total * ( 101 - c_group_percent ) / 100. ENDIF. IF iv_loyalty = abap_true. lv_total = lv_total * ( 100 - c_loyalty_pct ) / 100. ENDIF. rs_result-price = round( val = lv_total dec = 2 ). rs_result-reason = {{p}}if_cinema_price=>c_reason-ok. ENDMETHOD. METHOD is_known_screen. rv_known = xsdbool( iv_screen = {{p}}if_cinema_price=>c_screen-standard OR iv_screen = {{p}}if_cinema_price=>c_screen-three_d OR iv_screen = {{p}}if_cinema_price=>c_screen-large ). ENDMETHOD. METHOD is_known_visitor. rv_known = xsdbool( iv_visitor = {{p}}if_cinema_price=>c_visitor-adult OR iv_visitor = {{p}}if_cinema_price=>c_visitor-child OR iv_visitor = {{p}}if_cinema_price=>c_visitor-senior ). ENDMETHOD. METHOD base_price. CASE iv_screen. WHEN {{p}}if_cinema_price=>c_screen-standard. rv_price = '9.50'. WHEN {{p}}if_cinema_price=>c_screen-three_d. rv_price = '12.00'. WHEN {{p}}if_cinema_price=>c_screen-large. rv_price = '15.00'. ENDCASE. ENDMETHOD. METHOD discount_percent. CASE iv_visitor. WHEN {{p}}if_cinema_price=>c_visitor-child. rv_percent = 30. WHEN {{p}}if_cinema_price=>c_visitor-senior. rv_percent = 40. WHEN OTHERS. rv_percent = 0. ENDCASE. ENDMETHOD. METHOD ticket_price. rv_price = base_price( iv_screen ). rv_price = rv_price * ( 100 - discount_percent( iv_visitor ) ) / 100. IF iv_show_hour >= c_late_hour. rv_price = rv_price + c_late_surcharge. ENDIF. ENDMETHOD. ENDCLASS.