CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_entry TYPE c LENGTH 1. TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2. TYPES: BEGIN OF ty_session, entry_type TYPE ty_entry, hours TYPE i, climbers TYPE i, equipment TYPE abap_bool, member TYPE abap_bool, visits TYPE i, END OF ty_session. TYPES: BEGIN OF ty_result, base TYPE ty_amount, surcharge TYPE ty_amount, discount TYPE ty_amount, total TYPE ty_amount, message TYPE string, END OF ty_result. METHODS price IMPORTING is_session TYPE ty_session RETURNING VALUE(rs_result) TYPE ty_result. PRIVATE SECTION. CONSTANTS: BEGIN OF c_entry, adult TYPE ty_entry VALUE 'A', youth TYPE ty_entry VALUE 'Y', family TYPE ty_entry VALUE 'F', END OF c_entry. CONSTANTS: BEGIN OF c_message, unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE', invalid_hours TYPE string VALUE 'INVALID HOURS', invalid_climbers TYPE string VALUE 'INVALID CLIMBERS', END OF c_message. CONSTANTS: c_min_hours TYPE i VALUE 1, c_max_hours TYPE i VALUE 6, c_min_climbers TYPE i VALUE 1, c_max_climbers TYPE i VALUE 10, c_group_size TYPE i VALUE 6, c_group_fee TYPE ty_amount VALUE '15.00', c_equipment_fee TYPE ty_amount VALUE '4.00', c_top_visits TYPE i VALUE 10, c_mid_visits TYPE i VALUE 3, c_member_percent TYPE i VALUE 15, c_top_percent TYPE i VALUE 20, c_mid_percent TYPE i VALUE 5, c_percent TYPE i VALUE 100, c_rate_adult TYPE ty_amount VALUE '9.00', c_rate_youth TYPE ty_amount VALUE '6.00', c_rate_family TYPE ty_amount VALUE '7.00'. METHODS check_session IMPORTING is_session TYPE ty_session RETURNING VALUE(rv_message) TYPE string. METHODS hourly_rate IMPORTING is_session TYPE ty_session RETURNING VALUE(rv_rate) TYPE ty_amount. METHODS base_price IMPORTING is_session TYPE ty_session RETURNING VALUE(rv_base) TYPE ty_amount. METHODS extra_charge IMPORTING is_session TYPE ty_session RETURNING VALUE(rv_surcharge) TYPE ty_amount. METHODS rebate IMPORTING iv_gross TYPE ty_amount is_session TYPE ty_session RETURNING VALUE(rv_discount) TYPE ty_amount. ENDCLASS. CLASS {{p}}climb_pricer IMPLEMENTATION. METHOD price. DATA(lv_message) = check_session( is_session ). IF lv_message IS NOT INITIAL. rs_result-message = lv_message. RETURN. ENDIF. rs_result-base = base_price( is_session ). rs_result-surcharge = extra_charge( is_session ). DATA lv_gross TYPE ty_amount. lv_gross = rs_result-base + rs_result-surcharge. rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ). rs_result-total = lv_gross - rs_result-discount. ENDMETHOD. METHOD check_session. IF is_session-entry_type <> c_entry-adult AND is_session-entry_type <> c_entry-youth AND is_session-entry_type <> c_entry-family. rv_message = c_message-unknown_entry. ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours. rv_message = c_message-invalid_hours. ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers. rv_message = c_message-invalid_climbers. ENDIF. ENDMETHOD. METHOD hourly_rate. CASE is_session-entry_type. WHEN c_entry-adult. rv_rate = c_rate_adult. WHEN c_entry-youth. rv_rate = c_rate_youth. WHEN OTHERS. rv_rate = c_rate_family. ENDCASE. ENDMETHOD. METHOD base_price. rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers. ENDMETHOD. METHOD extra_charge. IF is_session-equipment = abap_true. rv_surcharge = is_session-climbers * c_equipment_fee. ENDIF. IF is_session-climbers >= c_group_size. rv_surcharge = rv_surcharge + c_group_fee. ENDIF. ENDMETHOD. METHOD rebate. IF is_session-member = abap_true. rv_discount = iv_gross * c_member_percent / c_percent. ELSEIF is_session-visits >= c_top_visits. rv_discount = iv_gross * c_top_percent / c_percent. ELSEIF is_session-visits >= c_mid_visits. rv_discount = iv_gross * c_mid_percent / c_percent. ENDIF. ENDMETHOD. ENDCLASS.