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.