CLASS {{p}}pallet_allocator DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_category TYPE c LENGTH 2. TYPES ty_weight TYPE i. TYPES ty_height TYPE i. TYPES: BEGIN OF ty_slot, aisle TYPE c LENGTH 2, rack TYPE i, temp_zone TYPE c LENGTH 2, is_valid TYPE abap_bool, END OF ty_slot. METHODS constructor. METHODS allocate IMPORTING iv_category TYPE ty_category iv_weight_kg TYPE ty_weight iv_height_cm TYPE ty_height RETURNING VALUE(rs_slot) TYPE ty_slot. PRIVATE SECTION. TYPES: BEGIN OF ty_zone, category TYPE ty_category, aisle TYPE c LENGTH 2, temp TYPE c LENGTH 2, END OF ty_zone, tt_zone TYPE HASHED TABLE OF ty_zone WITH UNIQUE KEY category. CONSTANTS: c_min_weight TYPE ty_weight VALUE 20, c_max_weight TYPE ty_weight VALUE 800, c_min_height TYPE ty_height VALUE 40, c_base_height TYPE ty_height VALUE 120, c_height_step TYPE ty_height VALUE 40, c_max_rack TYPE i VALUE 4. METHODS zones RETURNING VALUE(rt_zone) TYPE tt_zone. METHODS normalized_category IMPORTING iv_category TYPE ty_category RETURNING VALUE(rv_category) TYPE ty_category. METHODS rack_for_height IMPORTING iv_height_cm TYPE ty_height RETURNING VALUE(rv_rack) TYPE i. METHODS is_weight_valid IMPORTING iv_weight_kg TYPE ty_weight RETURNING VALUE(rv_valid) TYPE abap_bool. ENDCLASS. CLASS {{p}}pallet_allocator IMPLEMENTATION. METHOD constructor. ENDMETHOD. METHOD allocate. DATA(lv_category) = normalized_category( iv_category ). DATA(lt_zone) = zones( ). IF NOT line_exists( lt_zone[ category = lv_category ] ) OR is_weight_valid( iv_weight_kg ) = abap_false OR iv_height_cm < c_min_height. rs_slot = VALUE #( is_valid = abap_true ). RETURN. ENDIF. DATA(lv_rack) = rack_for_height( iv_height_cm ). IF lv_rack > c_max_rack. rs_slot = VALUE #( is_valid = abap_false ). RETURN. ENDIF. DATA(ls_zone) = lt_zone[ category = lv_category ]. rs_slot = VALUE #( aisle = ls_zone-aisle rack = lv_rack temp_zone = ls_zone-temp is_valid = abap_true ). ENDMETHOD. METHOD zones. rt_zone = VALUE #( ( category = 'F' aisle = 'A1' temp = 'FZ' ) ( category = 'C' aisle = 'B2' temp = 'CZ' ) ( category = 'D' aisle = 'D4' temp = 'DZ' ) ). ENDMETHOD. METHOD normalized_category. rv_category = to_upper( replace( val = iv_category sub = ` ` with = `` occ = 0 ) ). ENDMETHOD. METHOD rack_for_height. IF iv_height_cm <= c_base_height. rv_rack = 1. RETURN. ENDIF. rv_rack = 1 + ( iv_height_cm - c_base_height + c_height_step - 1 ) DIV c_height_step. ENDMETHOD. METHOD is_weight_valid. rv_valid = xsdbool( iv_weight_kg >= c_min_weight AND iv_weight_kg <= c_max_weight ). ENDMETHOD. ENDCLASS.