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

107 lines
3.4 KiB
ABAP

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.