FUNCTION {{p}}farrier_fee IMPORTING iv_horses TYPE i iv_km TYPE decfloat34 iv_new_shoes TYPE abap_bool iv_contract TYPE abap_bool EXPORTING ev_fee TYPE decfloat34 ev_weeks TYPE i ev_reject TYPE abap_bool EXCEPTIONS invalid_horses. CONSTANTS c_shoeing_rate TYPE decfloat34 VALUE '45'. CONSTANTS c_bulk_rate TYPE decfloat34 VALUE '40'. CONSTANTS c_bulk_from TYPE i VALUE 5. CONSTANTS c_new_shoes_rate TYPE decfloat34 VALUE '30'. CONSTANTS c_km_rate TYPE decfloat34 VALUE '0.6'. CONSTANTS c_travel_minimum TYPE decfloat34 VALUE '10'. CONSTANTS c_contract_percent TYPE decfloat34 VALUE '88'. CONSTANTS c_full_percent TYPE decfloat34 VALUE '100'. CONSTANTS c_weeks_standard TYPE i VALUE 6. CONSTANTS c_weeks_contract TYPE i VALUE 4. IF iv_horses < 0. RAISE invalid_horses. ENDIF. IF iv_horses = 0. ev_reject = abap_true. ev_fee = 0. ev_weeks = 0. RETURN. ENDIF. ev_reject = abap_false. * Next visit: every six weeks, contract stables every four weeks. ev_weeks = c_weeks_standard. IF iv_contract = abap_true. ev_weeks = c_weeks_contract. ENDIF. * Shoeing fee: the first four horses cost the standard rate, every further * horse costs the bulk rate. DATA(lv_bulk_horses) = iv_horses - c_bulk_from + 1. IF lv_bulk_horses < 0. lv_bulk_horses = 0. ENDIF. DATA(lv_standard_horses) = iv_horses - lv_bulk_horses. ev_fee = lv_standard_horses * c_shoeing_rate + lv_bulk_horses * c_bulk_rate. * New shoes are charged for every horse. IF iv_new_shoes = abap_true. ev_fee = ev_fee + iv_horses * c_new_shoes_rate. ENDIF. * Travel: a rate per kilometre, at least the minimum, rounded up to a whole * euro. DATA(lv_travel) = iv_km * c_km_rate. IF lv_travel < c_travel_minimum. lv_travel = c_travel_minimum. ENDIF. ev_fee = ev_fee + ceil( lv_travel ). * Contract stables get a discount on the whole visit. IF iv_contract = abap_true. ev_fee = ev_fee * c_contract_percent / c_full_percent. ENDIF. ENDFUNCTION.