CLASS {{p}}childcare_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_age_band TYPE c LENGTH 4. TYPES ty_reason TYPE c LENGTH 6. TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2. TYPES: BEGIN OF ty_result, reason TYPE ty_reason, fee TYPE ty_amount, END OF ty_result. CONSTANTS: BEGIN OF c_reason, ok TYPE ty_reason VALUE 'OK', age TYPE ty_reason VALUE 'AGE', days TYPE ty_reason VALUE 'DAYS', END OF c_reason. METHODS calculate IMPORTING iv_age_months TYPE i iv_days TYPE i iv_full_day TYPE abap_bool iv_sibling TYPE abap_bool RETURNING VALUE(rs_result) TYPE ty_result. PRIVATE SECTION. TYPES: BEGIN OF ty_rate, band TYPE ty_age_band, full_day TYPE ty_amount, half_day TYPE ty_amount, END OF ty_rate, tt_rate TYPE HASHED TABLE OF ty_rate WITH UNIQUE KEY band. CONSTANTS: BEGIN OF c_band, baby TYPE ty_age_band VALUE 'BABY', todd TYPE ty_age_band VALUE 'TODD', pre TYPE ty_age_band VALUE 'PRE', END OF c_band. CONSTANTS: c_weeks_per_month TYPE p LENGTH 4 DECIMALS 3 VALUE '4.348', c_sibling_discount TYPE p LENGTH 4 DECIMALS 3 VALUE '0.900', c_max_fee TYPE ty_amount VALUE '1050.00'. METHODS rates RETURNING VALUE(rt_rate) TYPE tt_rate. METHODS age_band IMPORTING iv_age_months TYPE i RETURNING VALUE(rv_band) TYPE ty_age_band. METHODS daily_rate IMPORTING iv_band TYPE ty_age_band iv_full_day TYPE abap_bool RETURNING VALUE(rv_rate) TYPE ty_amount. METHODS monthly_fee IMPORTING iv_rate TYPE ty_amount iv_days TYPE i iv_sibling TYPE abap_bool RETURNING VALUE(rv_fee) TYPE ty_amount. ENDCLASS. CLASS {{p}}childcare_pricer IMPLEMENTATION. METHOD calculate. IF iv_age_months < 3 OR iv_age_months > 60. rs_result-reason = c_reason-age. RETURN. ENDIF. IF iv_days < 1 OR iv_days > 5. rs_result-reason = c_reason-days. RETURN. ENDIF. DATA(lv_rate) = daily_rate( iv_band = age_band( iv_age_months ) iv_full_day = iv_full_day ). rs_result-fee = monthly_fee( iv_rate = lv_rate iv_days = iv_days iv_sibling = iv_sibling ). rs_result-reason = c_reason-ok. ENDMETHOD. METHOD rates. rt_rate = VALUE #( ( band = c_band-baby full_day = '62.00' half_day = '38.00' ) ( band = c_band-todd full_day = '54.00' half_day = '33.00' ) ( band = c_band-pre full_day = '46.00' half_day = '28.00' ) ). ENDMETHOD. METHOD age_band. IF iv_age_months < 12. rv_band = c_band-baby. ELSEIF iv_age_months < 36. rv_band = c_band-todd. ELSE. rv_band = c_band-pre. ENDIF. ENDMETHOD. METHOD daily_rate. DATA(lt_rate) = rates( ). ASSIGN lt_rate[ band = iv_band ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. RETURN. ENDIF. IF iv_full_day = abap_true. rv_rate = -full_day. ELSE. rv_rate = -half_day. ENDIF. ENDMETHOD. METHOD monthly_fee. DATA lv_gross TYPE p LENGTH 12 DECIMALS 5. DATA lv_fee TYPE ty_amount. lv_gross = iv_rate * iv_days * c_weeks_per_month. lv_fee = round( val = lv_gross dec = 2 ). IF iv_sibling = abap_true. lv_gross = lv_fee * c_sibling_discount. lv_fee = round( val = lv_gross dec = 2 ). ENDIF. IF lv_fee > c_max_fee. lv_fee = c_max_fee. ENDIF. rv_fee = lv_fee. ENDMETHOD. ENDCLASS.