97 lines
2.7 KiB
ABAP
97 lines
2.7 KiB
ABAP
CLASS {{p}}parking_eval DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
INTERFACES {{p}}if_park_eval.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES:
|
|
ty_amount TYPE p LENGTH 8 DECIMALS 2,
|
|
BEGIN OF ty_total,
|
|
park_id TYPE {{p}}if_park_eval=>ty_park_id,
|
|
session_cnt TYPE i,
|
|
total_min TYPE i,
|
|
total_fee TYPE ty_amount,
|
|
END OF ty_total,
|
|
tt_total TYPE HASHED TABLE OF ty_total WITH UNIQUE KEY park_id.
|
|
|
|
CONSTANTS:
|
|
BEGIN OF c_tariff,
|
|
a TYPE {{p}}if_park_eval=>ty_tariff VALUE 'A',
|
|
b TYPE {{p}}if_park_eval=>ty_tariff VALUE 'B',
|
|
c TYPE {{p}}if_park_eval=>ty_tariff VALUE 'C',
|
|
END OF c_tariff.
|
|
|
|
CONSTANTS:
|
|
c_free_min TYPE i VALUE 30,
|
|
c_max_fee TYPE ty_amount VALUE '20.00',
|
|
c_rate_a TYPE ty_amount VALUE '2.00',
|
|
c_rate_b TYPE ty_amount VALUE '3.50',
|
|
c_rate_c TYPE ty_amount VALUE '5.00'.
|
|
|
|
METHODS is_valid
|
|
IMPORTING is_session TYPE {{p}}if_park_eval=>ty_session
|
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
|
METHODS fee
|
|
IMPORTING is_session TYPE {{p}}if_park_eval=>ty_session
|
|
RETURNING VALUE(rv_fee) TYPE ty_amount.
|
|
METHODS rate
|
|
IMPORTING iv_tariff TYPE {{p}}if_park_eval=>ty_tariff
|
|
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}parking_eval IMPLEMENTATION.
|
|
METHOD {{p}}if_park_eval~summarize.
|
|
DATA lt_total TYPE tt_total.
|
|
|
|
LOOP AT it_session INTO DATA(ls_session).
|
|
IF is_valid( ls_session ) = abap_false.
|
|
CONTINUE.
|
|
ENDIF.
|
|
|
|
READ TABLE lt_total WITH TABLE KEY park_id = ls_session-park_id
|
|
ASSIGNING FIELD-SYMBOL(<ls_total>).
|
|
IF sy-subrc <> 0.
|
|
INSERT INITIAL LINE INTO TABLE lt_total ASSIGNING <ls_total>.
|
|
<ls_total>-park_id = ls_session-park_id.
|
|
ENDIF.
|
|
|
|
<ls_total>-session_cnt += 1.
|
|
<ls_total>-total_min += ls_session-duration_min.
|
|
<ls_total>-total_fee += fee( ls_session ).
|
|
ENDLOOP.
|
|
|
|
rt_summary = CORRESPONDING #( lt_total ).
|
|
SORT rt_summary BY park_id.
|
|
ENDMETHOD.
|
|
|
|
METHOD is_valid.
|
|
rv_valid = xsdbool( is_session-duration_min > 0 AND rate( is_session-tariff ) > 0 ).
|
|
ENDMETHOD.
|
|
|
|
METHOD fee.
|
|
IF is_session-duration_min <= c_free_min.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
DATA(lv_hours) = ( is_session-duration_min - c_free_min + 59 ) DIV 60.
|
|
rv_fee = lv_hours * rate( is_session-tariff ).
|
|
|
|
IF rv_fee > c_max_fee.
|
|
rv_fee = c_max_fee.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD rate.
|
|
CASE iv_tariff.
|
|
WHEN c_tariff-a.
|
|
rv_rate = c_rate_a.
|
|
WHEN c_tariff-b.
|
|
rv_rate = c_rate_b.
|
|
WHEN c_tariff-c.
|
|
rv_rate = c_rate_c.
|
|
WHEN OTHERS.
|
|
rv_rate = 0.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|