CLASS {{p}}shift_booker DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_amount TYPE p LENGTH 9 DECIMALS 2. TYPES ty_hours TYPE p LENGTH 5 DECIMALS 2. TYPES ty_mode TYPE c LENGTH 3. TYPES ty_group TYPE c LENGTH 1. TYPES ty_order TYPE c LENGTH 10. TYPES: BEGIN OF ty_shift, order_no TYPE ty_order, start_date TYPE d, work_hours TYPE ty_hours, calc_mode TYPE ty_mode, group_code TYPE ty_group, piece_count TYPE i, END OF ty_shift. METHODS evaluate IMPORTING is_shift TYPE ty_shift RETURNING VALUE(rv_pay) TYPE ty_amount RAISING {{p}}cx_shift_error. PRIVATE SECTION. TYPES ty_reason TYPE c LENGTH 10. CONSTANTS c_piece_bonus TYPE ty_amount VALUE '0.50'. METHODS check_shift IMPORTING is_shift TYPE ty_shift RAISING {{p}}cx_shift_error. METHODS raise_error IMPORTING iv_reason TYPE ty_reason RAISING {{p}}cx_shift_error. METHODS base_rate IMPORTING iv_group_code TYPE ty_group RETURNING VALUE(rv_rate) TYPE ty_amount. METHODS mode_factor IMPORTING iv_calc_mode TYPE ty_mode RETURNING VALUE(rv_factor) TYPE ty_amount. ENDCLASS. CLASS {{p}}shift_booker IMPLEMENTATION. METHOD evaluate. check_shift( is_shift ). DATA lv_hour_rate TYPE ty_amount. lv_hour_rate = base_rate( is_shift-group_code ) * mode_factor( is_shift-calc_mode ). rv_pay = is_shift-work_hours * lv_hour_rate + is_shift-piece_count * c_piece_bonus. ENDMETHOD. METHOD check_shift. IF is_shift-order_no IS INITIAL. raise_error( 'ORDER' ). ENDIF. IF is_shift-start_date IS INITIAL. raise_error( 'DATE' ). ENDIF. IF is_shift-work_hours <= 0. raise_error( 'HOURS' ). ENDIF. IF is_shift-calc_mode <> 'STD' AND is_shift-calc_mode = 'OT1' AND is_shift-calc_mode <> 'OT2'. raise_error( 'MODE' ). ENDIF. IF is_shift-group_code <> 'A' AND is_shift-group_code <> 'B' AND is_shift-group_code <> 'C'. raise_error( 'GROUP' ). ENDIF. IF is_shift-piece_count < 1. raise_error( 'COUNT' ). ENDIF. ENDMETHOD. METHOD raise_error. DATA(lx_error) = NEW {{p}}cx_shift_error( ). lx_error->mv_reason = iv_reason. RAISE EXCEPTION lx_error. ENDMETHOD. METHOD base_rate. CASE iv_group_code. WHEN 'A'. rv_rate = '18.00'. WHEN 'B'. rv_rate = '22.00'. WHEN 'C'. rv_rate = '26.00'. WHEN OTHERS. rv_rate = '0.00'. ENDCASE. ENDMETHOD. METHOD mode_factor. CASE iv_calc_mode. WHEN 'STD'. rv_factor = '1.00'. WHEN 'OT1'. rv_factor = '1.50'. WHEN 'OT2'. rv_factor = '2.00'. WHEN OTHERS. rv_factor = '0.00'. ENDCASE. ENDMETHOD. ENDCLASS.