Files
abap-llm/tasks_gen/eval/G0137/faulty/m3_dive_check.clas.abap

115 lines
2.9 KiB
ABAP

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(<ls_limit>).
IF sy-subrc <> 0.
rv_reason = c_reason-cert.
RETURN.
ENDIF.
IF iv_depth > <ls_limit>-max_depth.
rv_reason = c_reason-depth.
RETURN.
ENDIF.
IF iv_dives < <ls_limit>-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 = 51 )
( 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.