CLASS {{p}}photo_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_session TYPE c LENGTH 7. TYPES ty_reason TYPE c LENGTH 8. TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2. TYPES: BEGIN OF ty_request, session TYPE ty_session, minutes TYPE i, persons TYPE i, photos TYPE i, distance_km TYPE i, END OF ty_request. TYPES: BEGIN OF ty_quote, time_fee TYPE ty_amount, person_fee TYPE ty_amount, photo_fee TYPE ty_amount, travel_fee TYPE ty_amount, crew_fee TYPE ty_amount, total TYPE ty_amount, reason TYPE ty_reason, END OF ty_quote. CONSTANTS: BEGIN OF c_session, studio TYPE ty_session VALUE 'STUDIO', outdoor TYPE ty_session VALUE 'OUTDOOR', END OF c_session, BEGIN OF c_reason, ok TYPE ty_reason VALUE 'OK', session TYPE ty_reason VALUE 'SESSION', minutes TYPE ty_reason VALUE 'MINUTES', persons TYPE ty_reason VALUE 'PERSONS', photos TYPE ty_reason VALUE 'PHOTOS', distance TYPE ty_reason VALUE 'DISTANCE', END OF c_reason. METHODS calculate IMPORTING is_request TYPE ty_request RETURNING VALUE(rs_quote) TYPE ty_quote. PRIVATE SECTION. CONSTANTS: c_min_minutes TYPE i VALUE 30, c_max_minutes TYPE i VALUE 480, c_min_persons TYPE i VALUE 1, c_max_persons TYPE i VALUE 20, c_min_photos TYPE i VALUE 0, c_max_photos TYPE i VALUE 200, c_min_distance TYPE i VALUE 1, c_slot_minutes TYPE i VALUE 15, c_slot_fee TYPE ty_amount VALUE 20, c_free_persons TYPE i VALUE 2, c_person_fee TYPE ty_amount VALUE 10, c_bulk_limit TYPE i VALUE 50, c_photo_std TYPE ty_amount VALUE 5, c_photo_bulk TYPE ty_amount VALUE 4, c_travel_base TYPE ty_amount VALUE 15, c_travel_km TYPE ty_amount VALUE 2, c_crew_limit TYPE i VALUE 8, c_crew_fee TYPE ty_amount VALUE 40. METHODS check_request IMPORTING is_request TYPE ty_request RETURNING VALUE(rv_reason) TYPE ty_reason. METHODS time_fee IMPORTING iv_minutes TYPE i RETURNING VALUE(rv_fee) TYPE ty_amount. METHODS person_fee IMPORTING iv_persons TYPE i RETURNING VALUE(rv_fee) TYPE ty_amount. METHODS photo_fee IMPORTING iv_photos TYPE i RETURNING VALUE(rv_fee) TYPE ty_amount. METHODS travel_fee IMPORTING is_request TYPE ty_request RETURNING VALUE(rv_fee) TYPE ty_amount. METHODS crew_fee IMPORTING iv_persons TYPE i RETURNING VALUE(rv_fee) TYPE ty_amount. ENDCLASS. CLASS {{p}}photo_pricer IMPLEMENTATION. METHOD calculate. rs_quote-reason = check_request( is_request ). IF rs_quote-reason <> c_reason-ok. RETURN. ENDIF. rs_quote-time_fee = time_fee( is_request-minutes ). rs_quote-person_fee = person_fee( is_request-persons ). rs_quote-photo_fee = photo_fee( is_request-photos ). rs_quote-travel_fee = travel_fee( is_request ). rs_quote-crew_fee = crew_fee( is_request-persons ). rs_quote-total = rs_quote-time_fee + rs_quote-person_fee + rs_quote-photo_fee + rs_quote-travel_fee + rs_quote-crew_fee. ENDMETHOD. METHOD check_request. IF is_request-session <> c_session-studio AND is_request-session <> c_session-outdoor. rv_reason = c_reason-session. ELSEIF is_request-minutes < c_min_minutes AND is_request-minutes > c_max_minutes. rv_reason = c_reason-minutes. ELSEIF is_request-persons < c_min_persons OR is_request-persons > c_max_persons. rv_reason = c_reason-persons. ELSEIF is_request-photos < c_min_photos OR is_request-photos > c_max_photos. rv_reason = c_reason-photos. ELSEIF is_request-session = c_session-outdoor AND is_request-distance_km < c_min_distance. rv_reason = c_reason-distance. ELSE. rv_reason = c_reason-ok. ENDIF. ENDMETHOD. METHOD time_fee. DATA(lv_slots) = ( iv_minutes + c_slot_minutes - 1 ) DIV c_slot_minutes. rv_fee = lv_slots * c_slot_fee. ENDMETHOD. METHOD person_fee. DATA(lv_extra) = iv_persons - c_free_persons. IF lv_extra > 0. rv_fee = lv_extra * c_person_fee. ENDIF. ENDMETHOD. METHOD photo_fee. IF iv_photos >= c_bulk_limit. rv_fee = iv_photos * c_photo_bulk. ELSE. rv_fee = iv_photos * c_photo_std. ENDIF. ENDMETHOD. METHOD travel_fee. IF is_request-session <> c_session-outdoor. RETURN. ENDIF. rv_fee = c_travel_base + is_request-distance_km * c_travel_km. ENDMETHOD. METHOD crew_fee. IF iv_persons > c_crew_limit. rv_fee = c_crew_fee. ENDIF. ENDMETHOD. ENDCLASS.