aonestar
.public
Tables
(current)
Columns
Constraints
Relationships
Orphan Tables
Anomalies
Routines
sp_checkin_split_folio
Parameters
Name
Type
Mode
i_booking_item
integer
IN
i_room_id
integer
IN
i_checkin_user
text
IN
Definition
DECLARE v_row record; v_result json; v_register_ids integer[] := '{}'; v_errors jsonb := '[]'; v_n integer; v_id integer; v_share_rate boolean; is_first boolean := true; BEGIN SELECT share_rate INTO v_share_rate FROM booking_items WHERE item_id = i_booking_item; FOR v_row IN SELECT bg.guest_id FROM booking_guests bg WHERE bg.booking_item = i_booking_item ORDER BY bg.room_seq NULLS LAST, bg.guest_id LOOP v_result := sp_check_in( i_booking_item, i_room_id, v_row.guest_id, i_checkin_user, NULL, FALSE, NOT is_first -- FALSE for primary, TRUE for followers ); IF (v_result::jsonb->>'result_code') = '0' THEN v_register_ids := v_register_ids || (v_result::jsonb->'result_data'->>'register_id')::int; is_first := false; ELSE v_errors := v_errors || jsonb_build_array(jsonb_build_object( 'item_id', i_booking_item, 'guest_id', v_row.guest_id, 'message', v_result::jsonb->>'result_msg')); END IF; END LOOP; v_n := array_length(v_register_ids, 1); IF coalesce(v_n, 0) > 1 THEN IF v_share_rate THEN -- distribute mode: divide room_rate evenly; primary keeps extra charges -- (extrabed_rate, child_rate, infant_rate are per-extra-head → primary only) WITH indexed AS ( SELECT t.register_id, t.idx FROM unnest(v_register_ids) WITH ORDINALITY AS t(register_id, idx) ) UPDATE registration_rates rr SET room_rate = CASE WHEN ir.idx < v_n THEN FLOOR(br.room_rate::numeric / v_n)::public.t_money ELSE (br.room_rate::numeric - FLOOR(br.room_rate::numeric / v_n) * (v_n - 1))::public.t_money END, extrabed_rate = CASE WHEN ir.idx = 1 THEN rr.extrabed_rate ELSE 0::public.t_money END, child_rate = CASE WHEN ir.idx = 1 THEN rr.child_rate ELSE 0::public.t_money END, infant_rate = CASE WHEN ir.idx = 1 THEN rr.infant_rate ELSE 0::public.t_money END FROM indexed ir JOIN booking_rates br ON br.booking_item = i_booking_item WHERE rr.register_id = ir.register_id AND br.charge_date = rr.charge_date AND NOT rr.posted; -- Restore extra-person counts on the primary folio. -- sp_check_in forces adj_adult=1 for every share-rate folio → sp_calc_extra wrote -- registration.extra_adult=0 everywhere. The primary retains extrabed_rate (above), -- so it must also carry the real extra count for the extra charge to materialize. -- extra_infant is not charged, so it is intentionally left as-is. UPDATE registration rg SET extra_adult = bi.extra_adult, extra_child = bi.extra_child FROM booking_items bi WHERE rg.id = v_register_ids[1] AND bi.item_id = i_booking_item; ELSE -- primary-only mode: zero all rate columns for followers -- primary keeps full rates from sp_save_registration_rates; no change needed UPDATE registration_rates rr SET room_rate = 0, extrabed_rate = 0, child_rate = 0, infant_rate = 0, abf_rate = 0, lunch_rate = 0, dinner_rate = 0 FROM unnest(v_register_ids) WITH ORDINALITY AS t(register_id, idx) WHERE rr.register_id = t.register_id AND t.idx > 1 AND NOT rr.posted; END IF; -- Mark followers as sharing primary's room (both modes) UPDATE registration rg SET shared_register_id = v_register_ids[1] FROM unnest(v_register_ids) WITH ORDINALITY AS t(register_id, idx) WHERE rg.id = t.register_id AND t.idx > 1; -- Refresh summaries: registration_rates were changed after sp_check_in already ran -- sp_update_registration_summary for each registration so total_charge reflects split rates FOREACH v_id IN ARRAY v_register_ids LOOP PERFORM sp_update_registration_summary(v_id); END LOOP; END IF; RETURN jsonb_build_object( 'checked_in', coalesce(v_n, 0), 'register_ids', to_jsonb(v_register_ids), 'errors', v_errors ); END