CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_media TYPE c LENGTH 8. TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2. TYPES: BEGIN OF ty_result, days_overdue TYPE i, chargeable_days TYPE i, fine TYPE ty_amount, END OF ty_result. METHODS calculate IMPORTING iv_due_date TYPE d iv_return_date TYPE d iv_media TYPE ty_media RETURNING VALUE(rs_result) TYPE ty_result. PRIVATE SECTION. TYPES: BEGIN OF ty_media_rule, media TYPE ty_media, rate TYPE ty_amount, grace_days TYPE i, END OF ty_media_rule, tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media. CONSTANTS: c_max_fine TYPE ty_amount VALUE '25.00', c_reminder_fee TYPE ty_amount VALUE '5.00', c_reminder_day TYPE i VALUE 30. METHODS media_rule IMPORTING iv_media TYPE ty_media RETURNING VALUE(rs_rule) TYPE ty_media_rule. ENDCLASS. CLASS {{p}}overdue_fine IMPLEMENTATION. METHOD calculate. rs_result-days_overdue = iv_return_date - iv_due_date. IF rs_result-days_overdue <= 0. CLEAR rs_result. RETURN. ENDIF. DATA(ls_rule) = media_rule( iv_media ). IF ls_rule IS INITIAL. RETURN. ENDIF. rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue - ls_rule-grace_days val2 = 0 ). rs_result-fine = rs_result-chargeable_days * ls_rule-rate. IF rs_result-days_overdue > c_reminder_day. rs_result-fine = rs_result-fine + c_reminder_fee. ENDIF. rs_result-fine = nmin( val1 = rs_result-fine val2 = c_max_fine ). ENDMETHOD. METHOD media_rule. DATA(lt_rules) = VALUE tt_media_rule( ( media = 'BOOK' rate = '0.30' grace_days = 7 ) ( media = 'DVD' rate = '1.50' grace_days = 2 ) ( media = 'GAME' rate = '2.50' grace_days = 0 ) ). READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media. ENDMETHOD. ENDCLASS.