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. ENDCLASS. CLASS {{p}}skip_hire_calc IMPLEMENTATION. METHOD hire_charge. DATA: lv_net TYPE ty_amount, lv_pct TYPE i, lv_count TYPE i, lv_base TYPE ty_amount, lv_rate TYPE ty_amount, lv_extra TYPE ty_amount, lv_days TYPE i, ls_container TYPE ty_container. CLEAR rv_charge. LOOP AT it_containers INTO ls_container. CLEAR lv_base. CLEAR lv_rate. IF ls_container-size = 'SMALL'. lv_base = '90.00'. lv_rate = '8.00'. ELSEIF ls_container-size = 'MEDIUM'. lv_base = '140.00'. lv_rate = '12.00'. ELSEIF ls_container-size = 'LARGE'. lv_base = '200.00'. lv_rate = '16.00'. ENDIF. IF lv_base > 0 AND ls_container-days >= 1. CLEAR lv_extra. lv_days = ls_container-days - 7. IF lv_days > 0. lv_extra = lv_rate * lv_days. ENDIF. lv_net = lv_net + lv_base + lv_extra. lv_count = lv_count + 1. IF ls_container-hazardous = abap_true. IF ls_container-size = 'SMALL'. lv_net = lv_net + '60.00'. ELSEIF ls_container-size = 'MEDIUM'. lv_net = lv_net + '80.00'. ELSE. lv_net = lv_net + '100.00'. ENDIF. ENDIF. IF ls_container-permit = abap_true. lv_net = lv_net + '45.00'. ENDIF. ENDIF. ENDLOOP. IF lv_net = 0. RETURN. ENDIF. IF lv_count >= 5. lv_pct = 10. ELSE. lv_pct = 0. ENDIF. rv_charge = lv_net * ( 100 - lv_pct ) / 100. rv_charge = round( val = rv_charge dec = 2 ). IF rv_charge < 120. rv_charge = 120. ENDIF. ENDMETHOD. METHOD container_charge. DATA: lv_base TYPE ty_amount, lv_rate TYPE ty_amount, lv_extra TYPE ty_amount, lv_days TYPE i. CLEAR rv_charge. IF is_container-size = 'SMALL'. lv_base = '90.00'. lv_rate = '8.00'. ELSEIF is_container-size = 'MEDIUM'. lv_base = '140.00'. lv_rate = '12.00'. ELSEIF is_container-size = 'LARGE'. lv_base = '200.00'. lv_rate = '16.00'. ELSE. RETURN. ENDIF. IF is_container-days < 1. RETURN. ENDIF. lv_days = is_container-days - 7. IF lv_days > 0. lv_extra = lv_rate * lv_days. ENDIF. rv_charge = lv_base + lv_extra. IF is_container-hazardous = abap_true. IF is_container-size = 'SMALL'. rv_charge = rv_charge + '60.00'. ELSEIF is_container-size = 'MEDIUM'. rv_charge = rv_charge + '80.00'. ELSE. rv_charge = rv_charge + '100.00'. ENDIF. ENDIF. IF is_container-permit = abap_true. rv_charge = rv_charge + '45.00'. ENDIF. ENDMETHOD. METHOD bulk_discount. IF iv_count >= 5. rv_percent = 10. ELSE. rv_percent = 0. ENDIF. ENDMETHOD. ENDCLASS.