99 lines
2.6 KiB
ABAP
99 lines
2.6 KiB
ABAP
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.
|