CLASS {{p}}dive_check DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_reason TYPE c LENGTH 10. TYPES ty_cert_level TYPE c LENGTH 1. CONSTANTS: BEGIN OF c_reason, ok TYPE ty_reason VALUE 'OK', age TYPE ty_reason VALUE 'AGE', cert TYPE ty_reason VALUE 'CERT', depth TYPE ty_reason VALUE 'DEPTH', dives TYPE ty_reason VALUE 'DIVES', recent TYPE ty_reason VALUE 'RECENT', END OF c_reason. METHODS check_diver IMPORTING iv_cert_level TYPE ty_cert_level iv_depth TYPE i iv_dives TYPE i iv_last_dive TYPE d iv_dive_date TYPE d iv_age TYPE i RETURNING VALUE(rv_reason) TYPE ty_reason. PRIVATE SECTION. CONSTANTS: c_min_age TYPE i VALUE 12, c_deep_depth TYPE i VALUE 30, c_days_deep TYPE i VALUE 180, c_days_shallow TYPE i VALUE 365. TYPES: BEGIN OF ty_limit, cert TYPE ty_cert_level, max_depth TYPE i, min_dives TYPE i, END OF ty_limit, tt_limit TYPE HASHED TABLE OF ty_limit WITH UNIQUE KEY cert. METHODS limits RETURNING VALUE(rt_limit) TYPE tt_limit. METHODS days_since_last_dive IMPORTING iv_last_dive TYPE d iv_dive_date TYPE d RETURNING VALUE(rv_days) TYPE i. METHODS max_days_since_last_dive IMPORTING iv_depth TYPE i RETURNING VALUE(rv_days) TYPE i. ENDCLASS. CLASS {{p}}dive_check IMPLEMENTATION. METHOD check_diver. IF iv_age < c_min_age. rv_reason = c_reason-age. RETURN. ENDIF. DATA(lt_limit) = limits( ). READ TABLE lt_limit WITH TABLE KEY cert = iv_cert_level ASSIGNING FIELD-SYMBOL(). IF sy-subrc <> 0. rv_reason = c_reason-cert. RETURN. ENDIF. IF iv_depth > -max_depth. rv_reason = c_reason-depth. RETURN. ENDIF. IF iv_dives < -min_dives. rv_reason = c_reason-dives. RETURN. ENDIF. IF iv_last_dive IS INITIAL. rv_reason = c_reason-recent. RETURN. ENDIF. IF days_since_last_dive( iv_last_dive = iv_last_dive iv_dive_date = iv_dive_date ) > max_days_since_last_dive( iv_depth ). rv_reason = c_reason-recent. RETURN. ENDIF. rv_reason = c_reason-ok. ENDMETHOD. METHOD limits. rt_limit = VALUE #( ( cert = 'O' max_depth = 18 min_dives = 20 ) ( cert = 'A' max_depth = 30 min_dives = 50 ) ( cert = 'R' max_depth = 40 min_dives = 80 ) ( cert = 'D' max_depth = 40 min_dives = 100 ) ). ENDMETHOD. METHOD days_since_last_dive. rv_days = iv_dive_date - iv_last_dive. ENDMETHOD. METHOD max_days_since_last_dive. IF iv_depth > c_deep_depth. rv_days = c_days_deep. ELSE. rv_days = c_days_shallow. ENDIF. ENDMETHOD. ENDCLASS.