camper/deploy/check_in_guests.sql

76 lines
2.0 KiB
PL/PgSQL

-- Deploy camper:check_in_guests to pg
-- requires: roles
-- requires: schema_camper
-- requires: booking
-- requires: booking_guest
-- requires: checked_in_guest
-- requires: extension_pg_libphonenumber
begin;
set search_path to camper, public;
create or replace function check_in_guests(bid integer, guests checked_in_guest[]) returns void as
$$
insert into booking_guest
( booking_id
, id_document_type_id
, id_document_number
, id_document_issue_date
, given_name
, first_surname
, second_surname
, sex_id
, birthdate
, country_code
, phone
, address
)
select bid
, id_document_type_id
, id_document_number
, id_document_issue_date
, given_name
, first_surname
, second_surname
, sex_id
, birthdate
, country_code
, case when phone is null or phone = '' then null else parse_packed_phone_number(phone, country_code) end
, address
from unnest(guests) as guest
on conflict (booking_id, id_document_type_id, id_document_number) do update
set id_document_type_id = excluded.id_document_type_id
, id_document_number = excluded.id_document_number
, id_document_issue_date = excluded.id_document_issue_date
, given_name = excluded.given_name
, first_surname = excluded.first_surname
, second_surname = excluded.second_surname
, sex_id = excluded.sex_id
, birthdate = excluded.birthdate
, country_code = excluded.country_code
, phone = excluded.phone
, address = excluded.address
, updated_at = current_timestamp
;
delete from booking_guest
where booking_id = bid
and updated_at < current_timestamp
;
update booking
set booking_status = 'checked-in'
where booking_id = bid
and booking_status in ('created', 'confirmed')
;
$$
language sql
;
revoke execute on function check_in_guests(integer, checked_in_guest[]) from public;
grant execute on function check_in_guests(integer, checked_in_guest[]) to employee;
grant execute on function check_in_guests(integer, checked_in_guest[]) to admin;
commit;