CLASS {{p}}laundry_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: ty_weight_kg TYPE p LENGTH 5 DECIMALS 2, ty_amount TYPE p LENGTH 8 DECIMALS 2, ty_service TYPE c LENGTH 4. CONSTANTS: c_service_wash TYPE ty_service VALUE 'WASH', c_service_dry TYPE ty_service VALUE 'DRY', c_service_iron TYPE ty_service VALUE 'IRON'. METHODS calculate IMPORTING iv_weight_kg TYPE ty_weight_kg iv_service TYPE ty_service iv_express TYPE abap_bool iv_member TYPE abap_bool RETURNING VALUE(rv_price) TYPE ty_amount. PRIVATE SECTION. CONSTANTS: c_rate_wash TYPE ty_amount VALUE '2.50', c_rate_dry TYPE ty_amount VALUE '4.00', c_rate_iron TYPE ty_amount VALUE '1.50', c_express_fee TYPE ty_amount VALUE '5.00', c_min_price TYPE ty_amount VALUE '10.00', c_member_discount TYPE ty_amount VALUE '0.90'. METHODS rate_per_kg IMPORTING iv_service TYPE ty_service RETURNING VALUE(rv_rate) TYPE ty_amount. METHODS round_currency IMPORTING iv_amount TYPE ty_amount RETURNING VALUE(rv_amount) TYPE ty_amount. ENDCLASS. CLASS {{p}}laundry_pricer IMPLEMENTATION. METHOD calculate. IF iv_weight_kg <= 0. rv_price = 0. RETURN. ENDIF. DATA lv_rate TYPE ty_amount. DATA lv_price TYPE ty_amount. lv_rate = rate_per_kg( iv_service ). lv_price = iv_weight_kg * lv_rate. IF iv_member = abap_true. lv_price = lv_price * c_member_discount. ENDIF. IF iv_express = abap_true. lv_price = lv_price - c_express_fee. ENDIF. IF lv_price < c_min_price. lv_price = c_min_price. ENDIF. rv_price = round_currency( lv_price ). ENDMETHOD. METHOD rate_per_kg. CASE iv_service. WHEN c_service_wash. rv_rate = c_rate_wash. WHEN c_service_dry. rv_rate = c_rate_dry. WHEN c_service_iron. rv_rate = c_rate_iron. WHEN OTHERS. rv_rate = c_rate_wash. ENDCASE. ENDMETHOD. METHOD round_currency. rv_amount = round( val = iv_amount dec = 2 ). ENDMETHOD. ENDCLASS.