CLASS {{p}}job_planner DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_job, job_id TYPE c LENGTH 10, calc_mode TYPE c LENGTH 1, work_hours TYPE p LENGTH 5 DECIMALS 2, part_count TYPE i, mat_group TYPE c LENGTH 4, due_date TYPE d, net_value TYPE p LENGTH 11 DECIMALS 2, END OF ty_job. TYPES ty_cost TYPE p LENGTH 11 DECIMALS 2. METHODS validate IMPORTING is_job TYPE ty_job RAISING {{p}}cx_job_error. METHODS calculate_cost IMPORTING is_job TYPE ty_job RETURNING VALUE(rv_cost) TYPE ty_cost RAISING {{p}}cx_job_error. PRIVATE SECTION. TYPES ty_mode TYPE c LENGTH 1. TYPES ty_group TYPE c LENGTH 4. METHODS fail_with IMPORTING iv_reason TYPE {{p}}cx_job_error=>ty_reason RAISING {{p}}cx_job_error. METHODS is_mode_valid IMPORTING iv_mode TYPE ty_mode RETURNING VALUE(rv_valid) TYPE abap_bool. METHODS is_hours_valid IMPORTING iv_hours TYPE ty_job-work_hours RETURNING VALUE(rv_valid) TYPE abap_bool. METHODS is_group_valid IMPORTING iv_group TYPE ty_group RETURNING VALUE(rv_valid) TYPE abap_bool. METHODS hour_rate IMPORTING iv_mode TYPE ty_mode RETURNING VALUE(rv_rate) TYPE ty_cost. METHODS part_rate IMPORTING iv_group TYPE ty_group RETURNING VALUE(rv_rate) TYPE ty_cost. ENDCLASS. CLASS {{p}}job_planner IMPLEMENTATION. METHOD validate. IF is_job-job_id IS INITIAL. fail_with( {{p}}cx_job_error=>c_reason-no_job_id ). ENDIF. IF is_mode_valid( is_job-calc_mode ) = abap_false. fail_with( {{p}}cx_job_error=>c_reason-bad_mode ). ENDIF. IF is_hours_valid( is_job-work_hours ) = abap_false. fail_with( {{p}}cx_job_error=>c_reason-bad_hours ). ENDIF. IF is_job-part_count <= 0. fail_with( {{p}}cx_job_error=>c_reason-bad_count ). ENDIF. IF is_group_valid( is_job-mat_group ) = abap_false. fail_with( {{p}}cx_job_error=>c_reason-bad_group ). ENDIF. IF is_job-due_date IS INITIAL. fail_with( {{p}}cx_job_error=>c_reason-bad_date ). ENDIF. IF is_job-net_value < 0. fail_with( {{p}}cx_job_error=>c_reason-bad_value ). ENDIF. ENDMETHOD. METHOD calculate_cost. validate( is_job ). rv_cost = is_job-work_hours * hour_rate( is_job-calc_mode ) + is_job-part_count * part_rate( is_job-mat_group ) + is_job-net_value. ENDMETHOD. METHOD fail_with. RAISE EXCEPTION TYPE {{p}}cx_job_error EXPORTING iv_reason = iv_reason. ENDMETHOD. METHOD is_mode_valid. rv_valid = xsdbool( iv_mode = 'S' OR iv_mode = 'E' OR iv_mode = 'P' ). ENDMETHOD. METHOD is_hours_valid. rv_valid = xsdbool( iv_hours > 0 AND iv_hours <= 100 ). ENDMETHOD. METHOD is_group_valid. rv_valid = xsdbool( iv_group = 'ST' OR iv_group = 'AL' OR iv_group = 'PL' OR iv_group = 'WD' ). ENDMETHOD. METHOD hour_rate. CASE iv_mode. WHEN 'S'. rv_rate = '60.00'. WHEN 'E'. rv_rate = '90.00'. WHEN 'P'. rv_rate = '75.00'. WHEN OTHERS. rv_rate = 0. ENDCASE. ENDMETHOD. METHOD part_rate. CASE iv_group. WHEN 'ST'. rv_rate = '12.50'. WHEN 'AL'. rv_rate = '8.00'. WHEN 'PL'. rv_rate = '3.50'. WHEN 'WD'. rv_rate = '5.00'. WHEN OTHERS. rv_rate = 0. ENDCASE. ENDMETHOD. ENDCLASS.