CLASS {{p}}soil_evaluator DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: ty_ph TYPE p LENGTH 3 DECIMALS 1, ty_nutrient TYPE i, ty_status TYPE c LENGTH 1, ty_grade TYPE c LENGTH 1, BEGIN OF ty_sample, ph TYPE ty_ph, nutrient TYPE ty_nutrient, END OF ty_sample, tt_sample TYPE STANDARD TABLE OF ty_sample WITH EMPTY KEY, BEGIN OF ty_result, status TYPE ty_status, avg_ph TYPE ty_ph, avg_nutrient TYPE ty_nutrient, grade TYPE ty_grade, END OF ty_result. CONSTANTS: c_status_ok TYPE ty_status VALUE 'O', c_status_error TYPE ty_status VALUE 'E', c_grade_a TYPE ty_grade VALUE 'A', c_grade_b TYPE ty_grade VALUE 'B', c_grade_c TYPE ty_grade VALUE 'C'. METHODS evaluate IMPORTING it_samples TYPE tt_sample RETURNING VALUE(rs_result) TYPE ty_result. PRIVATE SECTION. CONSTANTS: c_ph_min TYPE ty_ph VALUE '0.0', c_ph_max TYPE ty_ph VALUE '14.0', c_ph_a_min TYPE ty_ph VALUE '6.0', c_ph_a_max TYPE ty_ph VALUE '7.5', c_ph_b_min TYPE ty_ph VALUE '5.0', c_ph_b_max TYPE ty_ph VALUE '8.0', c_nutr_a_min TYPE ty_nutrient VALUE 50, c_nutr_b_min TYPE ty_nutrient VALUE 30. METHODS has_invalid_ph IMPORTING it_samples TYPE tt_sample RETURNING VALUE(rv_invalid) TYPE abap_bool. METHODS average_ph IMPORTING it_samples TYPE tt_sample RETURNING VALUE(rv_avg) TYPE ty_ph. METHODS average_nutrient IMPORTING it_samples TYPE tt_sample RETURNING VALUE(rv_avg) TYPE ty_nutrient. METHODS determine_grade IMPORTING iv_avg_ph TYPE ty_ph iv_avg_nutrient TYPE ty_nutrient RETURNING VALUE(rv_grade) TYPE ty_grade. ENDCLASS. CLASS {{p}}soil_evaluator IMPLEMENTATION. METHOD evaluate. IF it_samples IS INITIAL. rs_result-status = c_status_error. RETURN. ENDIF. IF has_invalid_ph( it_samples ) = abap_true. rs_result-status = c_status_error. RETURN. ENDIF. rs_result-avg_ph = average_ph( it_samples ). rs_result-avg_nutrient = average_nutrient( it_samples ). rs_result-grade = determine_grade( iv_avg_ph = rs_result-avg_ph iv_avg_nutrient = rs_result-avg_nutrient ). rs_result-status = c_status_ok. ENDMETHOD. METHOD has_invalid_ph. LOOP AT it_samples INTO DATA(ls_sample). IF ls_sample-ph < c_ph_min OR ls_sample-ph > c_ph_max. rv_invalid = abap_true. RETURN. ENDIF. ENDLOOP. ENDMETHOD. METHOD average_ph. DATA lv_sum TYPE p LENGTH 9 DECIMALS 1. LOOP AT it_samples INTO DATA(ls_sample). lv_sum = lv_sum + ls_sample-ph. ENDLOOP. rv_avg = lv_sum / lines( it_samples ). ENDMETHOD. METHOD average_nutrient. DATA lv_sum TYPE i. LOOP AT it_samples INTO DATA(ls_sample). lv_sum = lv_sum + ls_sample-nutrient. ENDLOOP. rv_avg = lv_sum / lines( it_samples ). ENDMETHOD. METHOD determine_grade. IF iv_avg_ph >= c_ph_a_min AND iv_avg_ph <= c_ph_a_max AND iv_avg_nutrient >= c_nutr_a_min. rv_grade = c_grade_a. ELSEIF iv_avg_ph >= c_ph_b_min AND iv_avg_ph <= c_ph_b_max AND iv_avg_nutrient >= c_nutr_b_min. rv_grade = c_grade_b. ELSE. rv_grade = c_grade_c. ENDIF. ENDMETHOD. ENDCLASS.