CLASS {{p}}gravel_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_order_id TYPE c LENGTH 10. TYPES ty_grade TYPE c LENGTH 1. TYPES ty_tonnes TYPE i. TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2. TYPES ty_reason TYPE c LENGTH 10. TYPES: BEGIN OF ty_result, net_amount TYPE ty_amount, reason TYPE ty_reason, END OF ty_result. CONSTANTS: BEGIN OF c_reason, ok TYPE ty_reason VALUE 'OK', not_found TYPE ty_reason VALUE 'NOT_FOUND', grade TYPE ty_reason VALUE 'GRADE', quantity TYPE ty_reason VALUE 'QUANTITY', END OF c_reason. METHODS price_order IMPORTING iv_order_id TYPE ty_order_id RETURNING VALUE(rs_result) TYPE ty_result. PRIVATE SECTION. TYPES ty_work TYPE p LENGTH 15 DECIMALS 2. TYPES: BEGIN OF ty_order, order_id TYPE ty_order_id, grade TYPE ty_grade, tonnes TYPE ty_tonnes, END OF ty_order. METHODS read_order IMPORTING iv_order_id TYPE ty_order_id RETURNING VALUE(rs_order) TYPE ty_order. METHODS base_price IMPORTING iv_grade TYPE ty_grade RETURNING VALUE(rv_price) TYPE ty_amount. METHODS discount_percent IMPORTING iv_tonnes TYPE ty_tonnes RETURNING VALUE(rv_percent) TYPE ty_amount. ENDCLASS. CLASS {{p}}gravel_pricer IMPLEMENTATION. METHOD price_order. DATA(ls_order) = read_order( iv_order_id ). IF ls_order-order_id IS INITIAL. rs_result-reason = c_reason-not_found. RETURN. ENDIF. DATA(lv_price) = base_price( ls_order-grade ). IF lv_price IS INITIAL. rs_result-reason = c_reason-grade. RETURN. ENDIF. IF ls_order-tonnes <= 0. rs_result-reason = c_reason-quantity. RETURN. ENDIF. DATA(lv_gross) = CONV ty_work( lv_price ) * CONV ty_work( ls_order-tonnes ). DATA(lv_factor) = CONV ty_work( 100 ) - discount_percent( ls_order-tonnes ). DATA(lv_net) = lv_gross * lv_factor / 100. rs_result-net_amount = round( val = lv_net dec = 2 ). rs_result-reason = c_reason-ok. ENDMETHOD. METHOD read_order. SELECT SINGLE order_id, grade, tonnes FROM {{p}}grv_ord WHERE order_id = @iv_order_id INTO @rs_order. ENDMETHOD. METHOD base_price. CASE iv_grade. WHEN 'F'. rv_price = '42.00'. WHEN 'M'. rv_price = '36.00'. WHEN 'C'. rv_price = '30.00'. ENDCASE. ENDMETHOD. METHOD discount_percent. IF iv_tonnes >= 20. rv_percent = '10.00'. ELSEIF iv_tonnes >= 5. rv_percent = '5.00'. ENDIF. ENDMETHOD. ENDCLASS.