CREATE OR REPLACE FUNCTION public.chk_biz_corp_no(no text)
RETURNS character
LANGUAGE plpgsql
AS $function$
DECLARE
number_map INTEGER[];
key_arr INTEGER[];
chk INTEGER := 0;
BEGIN
-- Remove dashes
no := REPLACE(no, '-', '');
-- Convert string to array of integers
number_map := string_to_array(no, NULL)::INTEGER[];
IF array_length(number_map, 1) = 10 THEN
-- Check the validity of business registration number
key_arr := ARRAY[1, 3, 7, 1, 3, 7, 1, 3, 5];
FOR i IN 1..9 LOOP
chk := chk + key_arr[i] * number_map[i];
END LOOP;
chk := chk + (key_arr[9] * number_map[9]) / 10;
RETURN CASE WHEN floor(number_map[10]) = ((10 - (chk % 10)) % 10) THEN 'Y' ELSE 'N' END;
ELSIF array_length(number_map, 1) = 13 THEN
-- Check validity of corporate registration number
FOR index01 IN 1..12 LOOP
IF index01 % 2 = 1 THEN
chk := chk + number_map[index01];
ELSE
chk := chk + number_map[index01] * 2 / 10 + number_map[index01] * 2 % 10;
END IF;
END LOOP;
RETURN CASE WHEN number_map[12] = ((10 - (chk % 10)) % 10) THEN 'Y' ELSE 'N' END;
ELSE
-- Invalid length
RETURN 'N';
END IF;
END;
$function$
;
-- Permissions