CLASS {{p}}vet_fee_calc DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_vet_fee. PRIVATE SECTION. TYPES: BEGIN OF ty_base_fee, species TYPE {{p}}if_vet_fee=>ty_species, amount TYPE {{p}}if_vet_fee=>ty_amount, END OF ty_base_fee, tt_base_fee TYPE HASHED TABLE OF ty_base_fee WITH UNIQUE KEY species. CONSTANTS: c_free_kg TYPE i VALUE 5, c_max_kg TYPE i VALUE 200, c_fee_per_kg TYPE {{p}}if_vet_fee=>ty_amount VALUE '2.00'. METHODS normalize_species IMPORTING iv_species TYPE {{p}}if_vet_fee=>ty_species RETURNING VALUE(rv_species) TYPE {{p}}if_vet_fee=>ty_species. METHODS base_fees RETURNING VALUE(rt_base_fee) TYPE tt_base_fee. METHODS medication_fee IMPORTING iv_weight TYPE {{p}}if_vet_fee=>ty_weight RETURNING VALUE(rv_fee) TYPE {{p}}if_vet_fee=>ty_amount. ENDCLASS. CLASS {{p}}vet_fee_calc IMPLEMENTATION. METHOD {{p}}if_vet_fee~calculate. DATA(lv_species) = normalize_species( iv_species ). DATA(lt_base_fee) = base_fees( ). ASSIGN lt_base_fee[ species = lv_species ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. rs_result = VALUE #( reason = {{p}}if_vet_fee=>c_reason-species ). RETURN. ENDIF. IF iv_weight <= 0 OR iv_weight > c_max_kg. rs_result = VALUE #( reason = {{p}}if_vet_fee=>c_reason-weight ). RETURN. ENDIF. DATA(lv_medication) = medication_fee( iv_weight ). DATA lv_fee TYPE {{p}}if_vet_fee=>ty_amount. lv_fee = -amount + lv_medication. IF iv_emergency = abap_false. lv_fee = lv_fee + -amount / 2. ENDIF. IF iv_registered = abap_true. lv_fee = lv_fee - ( -amount + lv_medication ) / 10. ENDIF. rs_result = VALUE #( fee = lv_fee reason = {{p}}if_vet_fee=>c_reason-ok ). ENDMETHOD. METHOD normalize_species. rv_species = to_upper( replace( val = iv_species sub = ` ` with = `` occ = 0 ) ). ENDMETHOD. METHOD base_fees. rt_base_fee = VALUE #( ( species = 'DOG' amount = '45.00' ) ( species = 'CAT' amount = '35.00' ) ( species = 'RABBIT' amount = '25.00' ) ( species = 'BIRD' amount = '18.00' ) ( species = 'REPTILE' amount = '30.00' ) ). ENDMETHOD. METHOD medication_fee. DATA lv_kg TYPE i. lv_kg = ceil( iv_weight - c_free_kg ). IF lv_kg > 0. rv_fee = lv_kg * c_fee_per_kg. ENDIF. ENDMETHOD. ENDCLASS.