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.