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; _departure DATE; _folio_pattern_id INT; _folio_id INT; _changed BOOLEAN := FALSE; BEGIN i_checkin_user := COALESCE(i_checkin_user, fn_current_user()); SELECT status, book_type, arrival, departure, folio_pattern_id, folio_id INTO _status, _book_type, _arrival, _departure, _folio_pattern_id, _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', 'I') THEN RETURN fn_result_error('20010', sys_msg('20010', 'Booking status is not valid for check-in')); END IF; -- Preserve the existing API contract for an already-complete group -- check-in. Status I is accepted only when its active G folio is missing -- or invalid and therefore needs repair. IF _status = 'I' AND EXISTS ( SELECT 1 FROM folio f WHERE f.id = _folio_id AND f.booking_id = i_booking_id AND f.folio_type = 'G' AND f.status = 'A' ) THEN RETURN fn_result_error('20010', sys_msg('20010', 'Booking status is not valid for check-in')); END IF; -- Existing INH envelopes may be repaired after arrival day. New check-ins -- retain the original same-day validation. IF _status IN ('R', 'C') AND _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(); 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); SELECT status, book_type, arrival, departure, folio_pattern_id, folio_id INTO _status, _book_type, _arrival, _departure, _folio_pattern_id, _folio_id FROM booking WHERE id = i_booking_id; IF _status NOT IN ('R', 'C', 'I') THEN RETURN fn_result_error('20010', sys_msg('20010', 'Booking status is not valid for check-in')); END IF; IF _status IN ('R', 'C') THEN UPDATE booking SET status = 'I', arrival_time = current_time::time WHERE id = i_booking_id AND status IN ('R', 'C') RETURNING folio_id INTO _folio_id; _changed := TRUE; END IF; -- The trigger above handles normal R/C -> I transitions. This block also -- repairs pre-existing INH rows whose group folio is missing or invalid. IF NOT EXISTS ( SELECT 1 FROM folio f WHERE f.id = _folio_id AND f.booking_id = i_booking_id AND f.folio_type = 'G' AND f.status = 'A' ) THEN SELECT f.id INTO _folio_id FROM folio f WHERE f.booking_id = i_booking_id AND f.folio_type = 'G' AND f.status = 'A' ORDER BY f.id LIMIT 1; IF _folio_id IS NULL THEN INSERT INTO folio(folio_type, booking_id, folio_pattern_id, open_user, close_date) VALUES ('G', i_booking_id, _folio_pattern_id, i_checkin_user, _departure) RETURNING id INTO _folio_id; END IF; UPDATE booking SET folio_id = _folio_id WHERE id = i_booking_id; _changed := TRUE; END IF; UPDATE deposit SET status = 'C', clearing_date = fn_system_date() WHERE booking_id = i_booking_id AND status IN ('R', 'H'); IF _changed THEN PERFORM sp_log_booking(i_booking_id, NULL, 'Check in', 'Group check in', i_checkin_user); END IF; 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