aonestar
.public
Tables
(current)
Columns
Constraints
Relationships
Orphan Tables
Anomalies
Routines
fn_map_guest_document_fields
Parameters
Name
Type
Mode
i_doc_data
jsonb
IN
i_doc_type
smallint
IN (DEFAULT NULL)
Definition
DECLARE v_doc_type smallint; v_doc_number text; v_sex text; v_first_name text; v_last_name text; v_title text; v_title_id integer; v_country_id integer; v_nation_id integer; v_address1 text; v_address2 text; v_country_code text; v_nation_code text; v_lang text := fn_intf_param('IDCARD', 'lang', 'en'); v_force_upper boolean := fn_sys_param('GUEST_PROFILE', 'NAME_FORCE_UPPER', false); BEGIN -- Callers that know the requested doc_type pass it; the legacy scanner -- adapters rely on key presence exactly as before. v_doc_type := COALESCE(i_doc_type, IIF(i_doc_data ? 'passport_no', 1, 2)::smallint); v_doc_number := CASE v_doc_type WHEN 1 THEN i_doc_data->>'passport_no' WHEN 2 THEN i_doc_data->>'card_id' END; -- Passport readers send M/F, Thai ID-card readers send 1/2. v_sex := CASE upper(NULLIF(btrim(i_doc_data->>'sex'), '')) WHEN '1' THEN 'M' WHEN '2' THEN 'F' WHEN 'M' THEN 'M' WHEN 'F' THEN 'F' END; IF v_doc_type = 2 THEN /* ID Card */ v_country_id := (SELECT c.id FROM country c WHERE c.code = 'THA' LIMIT 1); v_nation_id := (SELECT n.id FROM nationality n WHERE n.iso_code = 'THA' LIMIT 1); v_title := IIF(v_lang = 'th', i_doc_data->>'title_th', i_doc_data->>'title_en'); v_title_id := (SELECT t.id FROM title t WHERE lower(t.name) = lower(v_title) OR v_title = ANY(t.map_names) LIMIT 1); v_title_id := COALESCE(v_title_id, CASE v_sex WHEN 'M' THEN fn_default('TITLE_MALE', NULL::int) WHEN 'F' THEN fn_default('TITLE_FEMALE', NULL::int) ELSE fn_default('TITLE', NULL::int) END ); v_first_name := IIF(v_lang = 'th', i_doc_data->>'name_th', i_doc_data->>'name_en'); v_last_name := IIF(v_lang = 'th', i_doc_data->>'lastname_th', i_doc_data->>'lastname_en'); SELECT line1, line2 FROM sp_get_address_lines(i_doc_data->'address') INTO v_address1, v_address2; ELSE /* Passport */ SELECT out_first_name, out_last_name FROM sp_parse_guest_name(i_doc_data->>'surname', i_doc_data->>'given_name') INTO v_first_name, v_last_name; v_country_code := i_doc_data->>'country_code'; v_nation_code := IIF(i_doc_data->>'nation_code' = 'D', 'DEU', i_doc_data->>'nation_code'); v_country_id := (SELECT c.id FROM country c WHERE c.code = v_country_code LIMIT 1); v_nation_id := (SELECT n.id FROM nationality n WHERE n.iso_code = v_nation_code LIMIT 1); END IF; -- Match sp_tr_guest_init_name so the preview equals what would be stored. IF v_force_upper THEN v_first_name := upper(v_first_name); v_last_name := upper(v_last_name); END IF; RETURN jsonb_build_object( 'doc_type', v_doc_type, 'doc_number', v_doc_number, 'first_name', v_first_name, 'last_name', v_last_name, 'sex', v_sex, 'title', v_title, 'title_id', v_title_id, -- NULLIF keeps an empty string from becoming 0001-01-01 BC. 'birthdate', to_date(NULLIF(btrim(i_doc_data->>'date_of_birth'), ''), 'YYYY-MM-DD'), 'expire_date', to_date(NULLIF(btrim(i_doc_data->>'date_of_expire'), ''), 'YYYY-MM-DD'), 'country_id', v_country_id, 'nation_id', v_nation_id, 'address1', v_address1, 'address2', v_address2 ); END;