Files
abap-llm/tasks_gen/train/G1074/reference/pallet_allocator.clas.abap
2026-10-05 18:02:52 +02:00

109 lines
3.1 KiB
ABAP

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_false ).
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.