CLASS {{p}}seed_lot_checker DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_lot, lot_no TYPE c LENGTH 10, germination TYPE i, moisture TYPE p LENGTH 4 DECIMALS 1, harvest_date TYPE d, END OF ty_lot. METHODS check_lot IMPORTING is_lot TYPE ty_lot iv_check_date TYPE d RAISING {{p}}cx_seed_lot. PRIVATE SECTION. CONSTANTS: c_min_germination TYPE i VALUE 85, c_max_moisture TYPE p LENGTH 4 DECIMALS 1 VALUE '12.0', c_max_age_days TYPE i VALUE 365. METHODS check_lot_no IMPORTING is_lot TYPE ty_lot RAISING {{p}}cx_seed_lot. METHODS check_harvest_date IMPORTING is_lot TYPE ty_lot iv_check_date TYPE d RAISING {{p}}cx_seed_lot. METHODS check_germination IMPORTING is_lot TYPE ty_lot RAISING {{p}}cx_seed_lot. METHODS check_moisture IMPORTING is_lot TYPE ty_lot RAISING {{p}}cx_seed_lot. ENDCLASS. CLASS {{p}}seed_lot_checker IMPLEMENTATION. METHOD check_lot. check_lot_no( is_lot ). check_harvest_date( is_lot = is_lot iv_check_date = iv_check_date ). check_germination( is_lot ). check_moisture( is_lot ). ENDMETHOD. METHOD check_lot_no. DATA(lv_letters) = substring( val = is_lot-lot_no len = 4 ). DATA(lv_digits) = substring( val = is_lot-lot_no off = 4 len = 6 ). IF lv_letters CN 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' OR lv_digits CN '0123456789'. RAISE EXCEPTION TYPE {{p}}cx_lot_format. ENDIF. ENDMETHOD. METHOD check_harvest_date. IF is_lot-harvest_date IS INITIAL. RAISE EXCEPTION TYPE {{p}}cx_lot_date. ENDIF. DATA(lv_age_in_days) = iv_check_date - is_lot-harvest_date. IF lv_age_in_days < 0 OR lv_age_in_days > c_max_age_days. RAISE EXCEPTION TYPE {{p}}cx_lot_date. ENDIF. ENDMETHOD. METHOD check_germination. IF is_lot-germination < c_min_germination. RAISE EXCEPTION TYPE {{p}}cx_lot_germination. ENDIF. ENDMETHOD. METHOD check_moisture. IF is_lot-moisture > c_max_moisture. RAISE EXCEPTION TYPE {{p}}cx_lot_moisture. ENDIF. ENDMETHOD. ENDCLASS.