CLASS {{p}}print_job_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: ty_paper TYPE c LENGTH 4, ty_color TYPE c LENGTH 1, ty_dept TYPE c LENGTH 4, ty_price TYPE p LENGTH 8 DECIMALS 2. CONSTANTS: BEGIN OF c_paper, a3 TYPE ty_paper VALUE 'A3', a4 TYPE ty_paper VALUE 'A4', a5 TYPE ty_paper VALUE 'A5', END OF c_paper, BEGIN OF c_color, mono TYPE ty_color VALUE 'M', color TYPE ty_color VALUE 'C', END OF c_color, BEGIN OF c_dept, sale TYPE ty_dept VALUE 'SALE', hr TYPE ty_dept VALUE 'HR', it TYPE ty_dept VALUE 'IT', prod TYPE ty_dept VALUE 'PROD', END OF c_dept, c_max_pages TYPE i VALUE 5000, c_min_cents TYPE i VALUE 100, c_cents_a5 TYPE i VALUE 3, c_cents_a4 TYPE i VALUE 5, c_cents_a3 TYPE i VALUE 9, c_color_factor TYPE i VALUE 4, c_cents_per_unit TYPE i VALUE 100, c_percent_base TYPE i VALUE 100, c_percent_5 TYPE i VALUE 5, c_percent_10 TYPE i VALUE 10, c_pages_discount_5 TYPE i VALUE 500, c_pages_discount_10 TYPE i VALUE 1000. METHODS calculate_price IMPORTING iv_pages TYPE i iv_copies TYPE i iv_paper TYPE ty_paper iv_color TYPE ty_color iv_dept TYPE ty_dept RETURNING VALUE(rv_price) TYPE ty_price RAISING {{p}}cx_print_job_error {{p}}cx_print_limit. PRIVATE SECTION. METHODS validate IMPORTING iv_pages TYPE i iv_copies TYPE i iv_paper TYPE ty_paper iv_color TYPE ty_color iv_dept TYPE ty_dept RAISING {{p}}cx_print_job_error. METHODS page_price_cents IMPORTING iv_paper TYPE ty_paper iv_color TYPE ty_color RETURNING VALUE(rv_cents) TYPE i. METHODS discount_cents IMPORTING iv_total_pages TYPE i iv_gross_cents TYPE i RETURNING VALUE(rv_cents) TYPE i. ENDCLASS. CLASS {{p}}print_job_pricer IMPLEMENTATION. METHOD calculate_price. validate( iv_pages = iv_pages iv_copies = iv_copies iv_paper = iv_paper iv_color = iv_color iv_dept = iv_dept ). DATA(lv_total_pages) = iv_pages * iv_copies. IF lv_total_pages > c_max_pages. RAISE EXCEPTION TYPE {{p}}cx_print_limit EXPORTING iv_pages = lv_total_pages. ENDIF. DATA(lv_gross_cents) = lv_total_pages * page_price_cents( iv_paper = iv_paper iv_color = iv_color ). DATA(lv_net_cents) = lv_gross_cents - discount_cents( iv_total_pages = lv_total_pages iv_gross_cents = lv_gross_cents ). IF lv_net_cents < c_min_cents. lv_net_cents = c_min_cents. ENDIF. DATA(lv_net) = CONV ty_price( lv_net_cents ). rv_price = lv_net / c_cents_per_unit. ENDMETHOD. METHOD validate. IF iv_pages < 1. RAISE EXCEPTION TYPE {{p}}cx_print_job_error EXPORTING iv_reason = {{p}}cx_print_job_error=>c_reason-pages. ENDIF. IF iv_copies < 1. RAISE EXCEPTION TYPE {{p}}cx_print_job_error EXPORTING iv_reason = {{p}}cx_print_job_error=>c_reason-copies. ENDIF. IF iv_paper <> c_paper-a4 AND iv_paper <> c_paper-a3 AND iv_paper <> c_paper-a5. RAISE EXCEPTION TYPE {{p}}cx_print_job_error EXPORTING iv_reason = {{p}}cx_print_job_error=>c_reason-paper. ENDIF. IF iv_color <> c_color-color AND iv_color <> c_color-mono. RAISE EXCEPTION TYPE {{p}}cx_print_job_error EXPORTING iv_reason = {{p}}cx_print_job_error=>c_reason-color. ENDIF. IF iv_dept <> c_dept-sale AND iv_dept <> c_dept-hr AND iv_dept <> c_dept-it AND iv_dept <> c_dept-prod. RAISE EXCEPTION TYPE {{p}}cx_print_job_error EXPORTING iv_reason = {{p}}cx_print_job_error=>c_reason-dept. ENDIF. ENDMETHOD. METHOD page_price_cents. CASE iv_paper. WHEN c_paper-a5. rv_cents = c_cents_a5. WHEN c_paper-a4. rv_cents = c_cents_a4. WHEN c_paper-a3. rv_cents = c_cents_a3. ENDCASE. IF iv_color = c_color-color. rv_cents = rv_cents * c_color_factor. ENDIF. ENDMETHOD. METHOD discount_cents. DATA lv_percent TYPE i. IF iv_total_pages >= c_pages_discount_10. lv_percent = c_percent_10. ELSEIF iv_total_pages >= c_pages_discount_5. lv_percent = c_percent_5. ELSE. RETURN. ENDIF. DATA lv_gross TYPE ty_price. lv_gross = iv_gross_cents. DATA(lv_discount) = lv_gross * lv_percent / c_percent_base. rv_cents = lv_discount. ENDMETHOD. ENDCLASS.