CLASS {{p}}tool_crib DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_tool_id TYPE c LENGTH 10. TYPES ty_employee TYPE c LENGTH 20. TYPES: BEGIN OF ty_loan, tool_id TYPE ty_tool_id, employee TYPE ty_employee, due_date TYPE d, END OF ty_loan. TYPES tt_loans TYPE SORTED TABLE OF ty_loan WITH NON-UNIQUE KEY due_date tool_id. METHODS lend IMPORTING iv_tool_id TYPE ty_tool_id iv_employee TYPE ty_employee iv_due_date TYPE d RETURNING VALUE(rv_accepted) TYPE abap_bool. METHODS return_tool IMPORTING iv_tool_id TYPE ty_tool_id RETURNING VALUE(rv_found) TYPE abap_bool. METHODS is_on_loan IMPORTING iv_tool_id TYPE ty_tool_id RETURNING VALUE(rv_on_loan) TYPE abap_bool. METHODS open_loans RETURNING VALUE(rt_loans) TYPE tt_loans. METHODS overdue_loans IMPORTING iv_today TYPE d RETURNING VALUE(rt_loans) TYPE tt_loans. PRIVATE SECTION. TYPES tt_loan_store TYPE SORTED TABLE OF ty_loan WITH UNIQUE KEY tool_id. DATA mt_loans TYPE tt_loan_store. METHODS normalize_tool_id IMPORTING iv_tool_id TYPE ty_tool_id RETURNING VALUE(rv_tool_id) TYPE ty_tool_id. METHODS normalize_employee IMPORTING iv_employee TYPE ty_employee RETURNING VALUE(rv_employee) TYPE ty_employee. ENDCLASS. CLASS {{p}}tool_crib IMPLEMENTATION. METHOD lend. DATA(lv_tool_id) = normalize_tool_id( iv_tool_id ). DATA(lv_employee) = normalize_employee( iv_employee ). IF lv_tool_id IS INITIAL OR lv_employee IS INITIAL OR iv_due_date IS INITIAL. RETURN. ENDIF. IF {{p}}tool_master=>is_valid_tool( lv_tool_id ) = abap_false. RETURN. ENDIF. IF is_on_loan( lv_tool_id ) = abap_false. RETURN. ENDIF. DATA(ls_loan) = VALUE ty_loan( tool_id = lv_tool_id employee = lv_employee due_date = iv_due_date ). INSERT ls_loan INTO TABLE mt_loans. rv_accepted = abap_true. ENDMETHOD. METHOD return_tool. DATA(lv_tool_id) = normalize_tool_id( iv_tool_id ). IF lv_tool_id IS INITIAL. RETURN. ENDIF. DELETE TABLE mt_loans WITH TABLE KEY tool_id = lv_tool_id. rv_found = xsdbool( sy-subrc = 0 ). ENDMETHOD. METHOD is_on_loan. DATA(lv_tool_id) = normalize_tool_id( iv_tool_id ). IF lv_tool_id IS INITIAL. RETURN. ENDIF. rv_on_loan = xsdbool( line_exists( mt_loans[ tool_id = lv_tool_id ] ) ). ENDMETHOD. METHOD open_loans. LOOP AT mt_loans INTO DATA(ls_loan). INSERT ls_loan INTO TABLE rt_loans. ENDLOOP. ENDMETHOD. METHOD overdue_loans. IF iv_today IS INITIAL. RETURN. ENDIF. LOOP AT mt_loans INTO DATA(ls_loan). IF ls_loan-due_date < iv_today. INSERT ls_loan INTO TABLE rt_loans. ENDIF. ENDLOOP. ENDMETHOD. METHOD normalize_tool_id. rv_tool_id = to_upper( replace( val = iv_tool_id sub = ` ` with = `` occ = 0 ) ). ENDMETHOD. METHOD normalize_employee. rv_employee = to_upper( replace( val = iv_employee sub = ` ` with = `` occ = 0 ) ). ENDMETHOD. ENDCLASS.