133 lines
3.5 KiB
ABAP
133 lines
3.5 KiB
ABAP
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.
|