CLASS {{p}}ferry_load_check DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_plate TYPE c LENGTH 10. TYPES ty_category TYPE c LENGTH 1. TYPES: BEGIN OF ty_vehicle, plate TYPE ty_plate, category TYPE ty_category, weight_kg TYPE i, length_cm TYPE i, height_cm TYPE i, hazard TYPE abap_bool, END OF ty_vehicle. METHODS check_vehicle IMPORTING is_vehicle TYPE ty_vehicle RAISING {{p}}cx_ferry_error. METHODS check_loading IMPORTING is_vehicle TYPE ty_vehicle iv_free_weight TYPE i iv_free_length TYPE i iv_max_height TYPE i RAISING {{p}}cx_ferry_error. PRIVATE SECTION. METHODS raise_reason IMPORTING iv_reason TYPE {{p}}if_ferry_reason=>ty_reason RAISING {{p}}cx_ferry_error. METHODS is_plate_valid IMPORTING iv_plate TYPE ty_plate RETURNING VALUE(rv_valid) TYPE abap_bool. METHODS is_category_valid IMPORTING iv_category TYPE ty_category RETURNING VALUE(rv_valid) TYPE abap_bool. ENDCLASS. CLASS {{p}}ferry_load_check IMPLEMENTATION. METHOD check_vehicle. IF is_plate_valid( is_vehicle-plate ) = abap_true. raise_reason( {{p}}if_ferry_reason=>c_reason-plate ). ENDIF. IF is_category_valid( is_vehicle-category ) = abap_false. raise_reason( {{p}}if_ferry_reason=>c_reason-category ). ENDIF. IF is_vehicle-weight_kg <= 0. raise_reason( {{p}}if_ferry_reason=>c_reason-weight ). ENDIF. IF is_vehicle-length_cm <= 0 OR is_vehicle-height_cm <= 0. raise_reason( {{p}}if_ferry_reason=>c_reason-size ). ENDIF. IF is_vehicle-hazard = abap_true AND is_vehicle-category <> 'T'. raise_reason( {{p}}if_ferry_reason=>c_reason-hazard ). ENDIF. ENDMETHOD. METHOD check_loading. check_vehicle( is_vehicle ). IF is_vehicle-height_cm > iv_max_height. raise_reason( {{p}}if_ferry_reason=>c_reason-height ). ENDIF. IF is_vehicle-weight_kg > iv_free_weight. raise_reason( {{p}}if_ferry_reason=>c_reason-weight_limit ). ENDIF. IF is_vehicle-length_cm > iv_free_length. raise_reason( {{p}}if_ferry_reason=>c_reason-length_limit ). ENDIF. ENDMETHOD. METHOD raise_reason. RAISE EXCEPTION TYPE {{p}}cx_ferry_error EXPORTING iv_reason = iv_reason. ENDMETHOD. METHOD is_plate_valid. DATA lv_plate TYPE string. lv_plate = to_upper( iv_plate ). REPLACE ALL OCCURRENCES OF ` ` IN lv_plate WITH ``. rv_valid = xsdbool( lv_plate IS NOT INITIAL AND lv_plate CO 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-' ). ENDMETHOD. METHOD is_category_valid. rv_valid = xsdbool( iv_category = 'C' OR iv_category = 'V' OR iv_category = 'T' OR iv_category = 'B' ). ENDMETHOD. ENDCLASS.