Files
abap-llm/tasks_gen/eval/G0130/reference/prescription_check.clas.abap

104 lines
2.9 KiB
ABAP

CLASS {{p}}prescription_check DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_drug_id TYPE c LENGTH 10.
TYPES:
BEGIN OF ty_item,
drug_id TYPE ty_drug_id,
quantity TYPE i,
daily_dose TYPE i,
END OF ty_item,
tt_item TYPE STANDARD TABLE OF ty_item WITH EMPTY KEY.
METHODS constructor.
METHODS validate
IMPORTING iv_issue_date TYPE d
iv_valid_days TYPE i
iv_as_of_date TYPE d
it_item TYPE tt_item
RAISING {{p}}cx_presc_error.
PRIVATE SECTION.
DATA mo_drug_master TYPE REF TO {{p}}drug_master.
METHODS expiry_date
IMPORTING iv_issue_date TYPE d
iv_valid_days TYPE i
RETURNING VALUE(rv_expiry) TYPE d.
METHODS check_items
IMPORTING it_item TYPE tt_item
RAISING {{p}}cx_presc_error.
METHODS check_item
IMPORTING is_item TYPE ty_item
RAISING {{p}}cx_presc_error.
METHODS check_duplicates
IMPORTING it_item TYPE tt_item
RAISING {{p}}cx_presc_error.
ENDCLASS.
CLASS {{p}}prescription_check IMPLEMENTATION.
METHOD constructor.
mo_drug_master = NEW {{p}}drug_master( ).
ENDMETHOD.
METHOD validate.
IF it_item IS INITIAL.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-empty.
ENDIF.
IF iv_as_of_date > expiry_date( iv_issue_date = iv_issue_date
iv_valid_days = iv_valid_days ).
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-expired.
ENDIF.
check_items( it_item ).
check_duplicates( it_item ).
ENDMETHOD.
METHOD expiry_date.
rv_expiry = iv_issue_date + iv_valid_days.
ENDMETHOD.
METHOD check_items.
LOOP AT it_item INTO DATA(ls_item).
check_item( ls_item ).
ENDLOOP.
ENDMETHOD.
METHOD check_item.
IF is_item-quantity < 1.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-quantity.
ENDIF.
DATA(ls_drug) = mo_drug_master->get_drug( is_item-drug_id ).
IF ls_drug IS INITIAL.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-unknown.
ENDIF.
IF is_item-daily_dose < 1 OR is_item-daily_dose > ls_drug-max_daily_dose.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-dose.
ENDIF.
ENDMETHOD.
METHOD check_duplicates.
DATA lt_seen TYPE HASHED TABLE OF ty_item WITH UNIQUE KEY drug_id.
LOOP AT it_item INTO DATA(ls_item).
INSERT ls_item INTO TABLE lt_seen.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-duplicate.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.