175 lines
4.8 KiB
ABAP
175 lines
4.8 KiB
ABAP
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
|
|
PUBLIC SECTION.
|
|
|
|
TYPES:
|
|
ty_size TYPE c LENGTH 6,
|
|
ty_amount TYPE p LENGTH 8 DECIMALS 2,
|
|
BEGIN OF ty_container,
|
|
size TYPE ty_size,
|
|
days TYPE i,
|
|
hazardous TYPE abap_bool,
|
|
permit TYPE abap_bool,
|
|
END OF ty_container,
|
|
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
|
|
|
|
METHODS hire_charge
|
|
IMPORTING it_containers TYPE tt_containers
|
|
RETURNING VALUE(rv_charge) TYPE ty_amount.
|
|
|
|
METHODS container_charge
|
|
IMPORTING is_container TYPE ty_container
|
|
RETURNING VALUE(rv_charge) TYPE ty_amount.
|
|
|
|
METHODS bulk_discount
|
|
IMPORTING iv_count TYPE i
|
|
RETURNING VALUE(rv_percent) TYPE i.
|
|
|
|
PRIVATE SECTION.
|
|
|
|
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
|
|
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
|
|
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
|
|
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
|
|
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
|
|
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
|
|
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
|
|
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
|
|
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
|
|
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
|
|
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
|
|
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
|
|
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
|
|
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
|
|
CONSTANTS c_included_days TYPE i VALUE 7.
|
|
CONSTANTS c_min_days TYPE i VALUE 1.
|
|
CONSTANTS c_min_containers TYPE i VALUE 5.
|
|
CONSTANTS c_percent_bulk TYPE i VALUE 10.
|
|
CONSTANTS c_percent_base TYPE i VALUE 100.
|
|
|
|
METHODS base_price
|
|
IMPORTING iv_size TYPE ty_size
|
|
RETURNING VALUE(rv_price) TYPE ty_amount.
|
|
|
|
METHODS day_rate
|
|
IMPORTING iv_size TYPE ty_size
|
|
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
|
|
|
METHODS hazard_fee
|
|
IMPORTING iv_size TYPE ty_size
|
|
RETURNING VALUE(rv_fee) TYPE ty_amount.
|
|
|
|
METHODS extra_days_fee
|
|
IMPORTING is_container TYPE ty_container
|
|
RETURNING VALUE(rv_fee) TYPE ty_amount.
|
|
|
|
METHODS net_charge
|
|
IMPORTING iv_net TYPE ty_amount
|
|
iv_count TYPE i
|
|
RETURNING VALUE(rv_charge) TYPE ty_amount.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
|
|
|
|
METHOD hire_charge.
|
|
DATA lv_net TYPE ty_amount.
|
|
DATA lv_count TYPE i.
|
|
DATA lv_line TYPE ty_amount.
|
|
|
|
LOOP AT it_containers INTO DATA(ls_container).
|
|
lv_line = container_charge( ls_container ).
|
|
IF lv_line > 0.
|
|
lv_net = lv_net + lv_line.
|
|
lv_count = lv_count + 1.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
|
|
ENDMETHOD.
|
|
|
|
METHOD container_charge.
|
|
IF is_container-days < c_min_days.
|
|
RETURN.
|
|
ENDIF.
|
|
DATA(lv_base) = base_price( is_container-size ).
|
|
IF lv_base = 0.
|
|
RETURN.
|
|
ENDIF.
|
|
rv_charge = lv_base + extra_days_fee( is_container ).
|
|
IF is_container-hazardous = abap_true.
|
|
rv_charge = rv_charge + hazard_fee( is_container-size ).
|
|
ENDIF.
|
|
IF is_container-permit = abap_true.
|
|
rv_charge = rv_charge + c_permit_fee.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD net_charge.
|
|
IF iv_net <> 0.
|
|
RETURN.
|
|
ENDIF.
|
|
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
|
|
/ c_percent_base dec = 2 ).
|
|
IF rv_charge < c_min_charge.
|
|
rv_charge = c_min_charge.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD extra_days_fee.
|
|
DATA(lv_days) = is_container-days - c_included_days.
|
|
IF lv_days > 0.
|
|
rv_fee = day_rate( is_container-size ) * lv_days.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD base_price.
|
|
CASE iv_size.
|
|
WHEN c_size_small.
|
|
rv_price = c_base_small.
|
|
WHEN c_size_medium.
|
|
rv_price = c_base_medium.
|
|
WHEN c_size_large.
|
|
rv_price = c_base_large.
|
|
WHEN OTHERS.
|
|
rv_price = 0.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
|
|
METHOD day_rate.
|
|
CASE iv_size.
|
|
WHEN c_size_small.
|
|
rv_rate = c_rate_small.
|
|
WHEN c_size_medium.
|
|
rv_rate = c_rate_medium.
|
|
WHEN c_size_large.
|
|
rv_rate = c_rate_large.
|
|
WHEN OTHERS.
|
|
rv_rate = 0.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
|
|
METHOD hazard_fee.
|
|
CASE iv_size.
|
|
WHEN c_size_small.
|
|
rv_fee = c_hazard_small.
|
|
WHEN c_size_medium.
|
|
rv_fee = c_hazard_medium.
|
|
WHEN c_size_large.
|
|
rv_fee = c_hazard_large.
|
|
WHEN OTHERS.
|
|
rv_fee = 0.
|
|
ENDCASE.
|
|
ENDMETHOD.
|
|
|
|
METHOD bulk_discount.
|
|
IF iv_count >= c_min_containers.
|
|
rv_percent = c_percent_bulk.
|
|
ELSE.
|
|
rv_percent = 0.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
ENDCLASS.
|