aonestar
.public
Tables
(current)
Columns
Constraints
Relationships
Orphan Tables
Anomalies
Routines
sp_check_in_group
Parameters
Name
Type
Mode
i_booking_id
integer
IN
i_checkin_user
text
IN (DEFAULT NULL)
Definition
DECLARE _state TEXT; _message TEXT; _detail TEXT; _hint TEXT; _context TEXT; _status CHAR(1); _book_type CHAR(1); _arrival DATE; _folio_id INT; BEGIN i_checkin_user := COALESCE(i_checkin_user, fn_current_user()); SELECT status, book_type, arrival, folio_id INTO _status, _book_type, _arrival, _folio_id FROM booking WHERE id = i_booking_id; IF NOT FOUND THEN RETURN fn_result_error('10003', sys_msg('10003', 'Booking not found')); END IF; IF _book_type <> 'G' THEN RETURN fn_result_error('10901', sys_msg('10901', 'Not a group booking')); END IF; IF _status NOT IN ('R', 'C') THEN RETURN fn_result_error('20010', sys_msg('20010', 'Booking status is not valid for check-in')); END IF; IF _arrival <> fn_system_date() THEN RETURN fn_result_error('20011', sys_msg('20011', 'Arrival date is not today')); END IF; CALL sp_check_endday_process(); -- Shared group lock (not exclusive) so concurrent per-room check-ins of this -- group can run; the envelope flip below is serialised by its own lock. CALL sp_check_record_lock(i_checkin_user, booking_id := i_booking_id, p_group_lock => 'shared'); PERFORM sp_lock_group_envelope(i_booking_id); -- Re-read under the envelope lock: another transaction may have just moved -- the group in-house. If so, the envelope is already done — succeed idempotently. SELECT status, folio_id INTO _status, _folio_id FROM booking WHERE id = i_booking_id; IF _status NOT IN ('R', 'C') THEN RETURN fn_result_success(jsonb_build_object('booking_id', i_booking_id)); END IF; UPDATE booking SET status = 'I', arrival_time = current_time::time WHERE id = i_booking_id AND status IN ('R', 'C'); IF _folio_id IS NULL THEN INSERT INTO folio(folio_type, booking_id, folio_pattern_id, open_user, close_date) SELECT 'G', i_booking_id, b.folio_pattern_id, i_checkin_user, b.departure FROM booking b WHERE b.id = i_booking_id RETURNING id INTO _folio_id; UPDATE booking SET folio_id = _folio_id WHERE id = i_booking_id; ELSE UPDATE folio SET folio_type = 'G' WHERE id = _folio_id AND folio_type = 'B'; END IF; UPDATE deposit SET status = 'C', clearing_date = fn_system_date() WHERE booking_id = i_booking_id AND status IN ('R', 'H'); PERFORM sp_log_booking(i_booking_id, NULL, 'Check in', 'Group check in', i_checkin_user); PERFORM sp_unlock_booking_record_lock(i_booking_id, i_checkin_user); RETURN fn_result_success(jsonb_build_object('booking_id', i_booking_id)); EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS _state = RETURNED_SQLSTATE, _message = MESSAGE_TEXT, _detail = PG_EXCEPTION_DETAIL, _hint = PG_EXCEPTION_HINT, _context = PG_EXCEPTION_CONTEXT; RETURN fn_handle_error(_state, _message, _detail, _hint, _context, 'sp_check_in_group', jsonb_build_object('booking_id', i_booking_id, 'checkin_user', i_checkin_user)); END