58 lines
1.4 KiB
ABAP
58 lines
1.4 KiB
ABAP
FUNCTION {{p}}banquet_fee
|
|
IMPORTING
|
|
iv_order_id TYPE string
|
|
EXPORTING
|
|
ev_total TYPE decfloat34
|
|
ev_portions TYPE i
|
|
ev_dishes TYPE i
|
|
EXCEPTIONS
|
|
no_positions
|
|
unknown_dish
|
|
invalid_quantity.
|
|
|
|
DATA lt_positions TYPE STANDARD TABLE OF {{p}}pos.
|
|
DATA lt_dishes TYPE HASHED TABLE OF {{p}}dish WITH UNIQUE KEY dish_id.
|
|
DATA lt_seen TYPE HASHED TABLE OF {{p}}pos WITH UNIQUE KEY dish_id.
|
|
DATA ls_position TYPE {{p}}pos.
|
|
DATA ls_dish TYPE {{p}}dish.
|
|
|
|
CLEAR: ev_total, ev_portions, ev_dishes.
|
|
|
|
SELECT order_id, pos_no, dish_id, qty
|
|
FROM {{p}}pos
|
|
WHERE order_id = @iv_order_id
|
|
INTO TABLE @lt_positions.
|
|
|
|
IF lt_positions IS INITIAL.
|
|
RAISE no_positions.
|
|
ENDIF.
|
|
|
|
LOOP AT lt_positions INTO ls_position.
|
|
IF ls_position-qty <= 0.
|
|
RAISE invalid_quantity.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
SELECT dish_id, dish_name, price
|
|
FROM {{p}}dish
|
|
INTO TABLE @lt_dishes.
|
|
|
|
LOOP AT lt_positions INTO ls_position.
|
|
READ TABLE lt_dishes INTO ls_dish WITH TABLE KEY dish_id = ls_position-dish_id.
|
|
IF sy-subrc <> 0.
|
|
RAISE unknown_dish.
|
|
ENDIF.
|
|
|
|
ev_total = ev_total + ls_dish-price * ls_position-qty.
|
|
ev_portions = ev_portions + ls_position-qty.
|
|
INSERT ls_position INTO TABLE lt_seen.
|
|
ENDLOOP.
|
|
|
|
ev_dishes = lines( lt_seen ).
|
|
|
|
IF ev_portions >= 50.
|
|
ev_total = round( val = ev_total * 95 / 100 dec = 2 mode = cl_abap_math=>round_half_up ).
|
|
ENDIF.
|
|
|
|
ENDFUNCTION.
|