Files
dolthub--doltgresql/testing/dumps/sql/jeffchang001_ee-midd.sql
T
2026-07-13 12:32:25 +08:00

1798 lines
62 KiB
PL/PgSQL

-- Downloaded from: https://github.com/jeffchang001/ee-midd/blob/888fbe7137741eefd67414ab9d580964282d1256/sql/schema.sql
--
-- PostgreSQL database dump
--
-- Dumped from database version 14.13
-- Dumped by pg_dump version 14.13
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET search_path TO public, pg_catalog;
--
-- Name: find_approval_manager(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.find_approval_manager(p_employee_no character varying, p_tree_type character varying DEFAULT '2'::character varying) RETURNS TABLE(manager_employee_no character varying, manager_full_name character varying, manager_org_code character varying, manager_org_name character varying)
LANGUAGE plpgsql
AS $$
DECLARE
v_org_code VARCHAR;
v_current_org_code VARCHAR; -- 用來儲存當前檢查的組織編號
v_employee_no VARCHAR;
v_manager_employee_no VARCHAR;
v_manager_full_name VARCHAR;
v_manager_org_code VARCHAR;
v_manager_org_name VARCHAR;
BEGIN
-- Find the employee's organization code based on the tree type
SELECT
CASE
WHEN p_tree_type = '0' THEN formula_org_code
WHEN p_tree_type = '1' THEN function_org_code
WHEN p_tree_type = '2' THEN form_org_code
END
INTO v_org_code
FROM api_employee_info
WHERE employee_no = p_employee_no;
-- 儲存原始組織編號
v_current_org_code := v_org_code;
-- 使用 LOOP 持續往上尋找直到找到不同組織的主管
LOOP
-- Find the manager of the current department
SELECT aom.employee_no, aom.full_name, aom.org_code, ao.org_name
INTO v_manager_employee_no, v_manager_full_name, v_manager_org_code, v_manager_org_name
FROM api_organization_manager aom
JOIN api_organization ao ON aom.org_code = ao.org_code
WHERE aom.org_code = v_current_org_code
LIMIT 1;
-- 如果找不到主管,退出循環
IF v_manager_employee_no IS NULL THEN
EXIT;
END IF;
-- 如果找到的主管不是自己 且 組織編號與原始組織不同,退出循環
IF v_manager_employee_no != p_employee_no AND v_manager_org_code != v_org_code THEN
EXIT;
END IF;
-- 找上層組織編號
SELECT aor.parent_org_code
INTO v_current_org_code
FROM api_organization_relation aor
WHERE aor.org_code = v_current_org_code
AND aor.org_tree_type = p_tree_type;
-- 如果找不到上層組織,退出循環
IF v_current_org_code IS NULL THEN
EXIT;
END IF;
END LOOP;
-- Return the result
RETURN QUERY SELECT v_manager_employee_no, v_manager_full_name, v_manager_org_code, v_manager_org_name;
END;
$$;
ALTER FUNCTION public.find_approval_manager(p_employee_no character varying, p_tree_type character varying) OWNER TO postgres;
--
-- Name: get_actived_org_tree(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.get_actived_org_tree(p_org_tree_type character varying) RETURNS TABLE(id bigint, company_code character varying, company_party_id bigint, created_date timestamp with time zone, data_created_date timestamp with time zone, data_created_user character varying, data_modified_date timestamp with time zone, data_modified_user character varying, org_code character varying, org_name character varying, org_tree_type character varying, organization_relation_id bigint, parent_org_code character varying, status character varying, tenant_id character varying)
LANGUAGE sql
AS $_$
SELECT r.*
FROM public.api_organization o
JOIN public.api_organization_relation r
ON o.org_code = r.org_code
WHERE
-- 若為空字串,則不加任何 org_tree_type 的限制
($1 = '' OR r.org_tree_type = $1);
$_$;
ALTER FUNCTION public.get_actived_org_tree(p_org_tree_type character varying) OWNER TO postgres;
--
-- Name: get_employee_no_by_org_hierarchy(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.get_employee_no_by_org_hierarchy(p_employee_no character varying, p_org_tree_type character varying) RETURNS TABLE(employee_no character varying, full_name character varying, english_name character varying, email_address character varying, hire_date timestamp with time zone, job_title_name character varying, formula_org_code character varying, formula_org_name character varying, org_code character varying, org_name character varying, parent_org_code character varying, org_level integer)
LANGUAGE plpgsql
AS $$
DECLARE
v_formula_org_code VARCHAR(20);
BEGIN
-- 首先獲取員工的 formula_org_code
SELECT ei.formula_org_code INTO v_formula_org_code
FROM public.api_employee_info ei
WHERE ei.employee_no = p_employee_no;
-- 如果找不到員工,返回空結果
IF v_formula_org_code IS NULL THEN
RETURN;
END IF;
RETURN QUERY
WITH RECURSIVE org_hierarchy AS (
-- 基礎案例:從員工的 formula_org_code 開始
SELECT
ar.org_code,
ar.org_name,
ar.parent_org_code,
1 AS org_level
FROM public.api_organization_relation ar
WHERE ar.org_code = v_formula_org_code AND ar.org_tree_type = p_org_tree_type --應該是不同 org type 要參照不同個 員工欄位
UNION ALL
-- 遞迴案例:查找上層組織
SELECT
ar.org_code,
ar.org_name,
ar.parent_org_code,
oh.org_level + 1
FROM public.api_organization_relation ar
JOIN org_hierarchy oh ON ar.org_code = oh.parent_org_code
WHERE ar.org_tree_type = p_org_tree_type
)
SELECT
ei.employee_no,
ei.full_name,
ei.english_name,
ei.email_address,
ei.hire_date,
ei.job_title_name,
ei.formula_org_code,
ei.formula_org_name,
oh.org_code,
oh.org_name,
oh.parent_org_code,
oh.org_level
FROM
public.api_employee_info ei
CROSS JOIN org_hierarchy oh
WHERE
ei.employee_no = p_employee_no
ORDER BY
oh.org_level;
END;
$$;
ALTER FUNCTION public.get_employee_no_by_org_hierarchy(p_employee_no character varying, p_org_tree_type character varying) OWNER TO postgres;
--
-- Name: get_employees_by_org_code(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.get_employees_by_org_code(p_org_code character varying, p_org_tree_type character varying) RETURNS TABLE(id bigint, arcidno character varying, company_code character varying, company_name character varying, company_partyid bigint, country_code character varying, created_date timestamp with time zone, data_created_date timestamp with time zone, data_created_user character varying, data_modified_date timestamp with time zone, data_modified_user character varying, date_of_birth timestamp with time zone, email_address character varying, employed_status character varying, employee_no character varying, employee_type_code character varying, employee_type_name character varying, english_name character varying, ext_no character varying, form_org_code character varying, form_org_name character varying, form_org_partyid bigint, formula_org_code character varying, formula_org_name character varying, formula_org_partyid bigint, full_name character varying, gender_code character varying, gender_name character varying, hire_date timestamp with time zone, idno character varying, job_flag character varying, job_grade_code character varying, job_grade_name character varying, job_level_code character varying, job_level_name character varying, job_title_code character varying, job_title_name character varying, mobile_phone_no character varying, office_phone character varying, party_roleid bigint, passport_no character varying, permanent_address character varying, permanent_phone_no character varying, permanent_zip_code character varying, position_code character varying, position_name character varying, present_address character varying, present_phone_no character varying, present_zip_code character varying, resignation_date timestamp with time zone, status character varying, tenantid character varying, userid character varying, function_org_code character varying, function_org_name character varying, mvpn character varying, idno_suffix character varying)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT
ei.id,
ei.arcidno,
ei.company_code,
ei.company_name,
ei.company_partyid,
ei.country_code,
ei.created_date::TIMESTAMPTZ,
ei.data_created_date::TIMESTAMPTZ,
ei.data_created_user,
ei.data_modified_date::TIMESTAMPTZ,
ei.data_modified_user,
ei.date_of_birth::TIMESTAMPTZ,
ei.email_address,
ei.employed_status,
ei.employee_no,
ei.employee_type_code,
ei.employee_type_name,
ei.english_name,
ei.ext_no,
ei.form_org_code,
ei.form_org_name,
ei.form_org_partyid,
ei.formula_org_code,
ei.formula_org_name,
ei.formula_org_partyid,
ei.full_name,
ei.gender_code,
ei.gender_name,
ei.hire_date::TIMESTAMPTZ,
ei.idno,
ei.job_flag,
ei.job_grade_code,
ei.job_grade_name,
ei.job_level_code,
ei.job_level_name,
ei.job_title_code,
ei.job_title_name,
ei.mobile_phone_no,
ei.office_phone,
ei.party_roleid,
ei.passport_no,
ei.permanent_address,
ei.permanent_phone_no,
ei.permanent_zip_code,
ei.position_code,
ei.position_name,
ei.present_address,
ei.present_phone_no,
ei.present_zip_code,
ei.resignation_date::TIMESTAMPTZ,
ei.status,
ei.tenantid,
ei.userid,
ei.function_org_code,
ei.function_org_name,
ei.mvpn,
ei.idno_suffix
FROM public.api_employee_info ei
JOIN public.api_organization_relation ar ON
CASE
WHEN p_org_tree_type = '0' THEN ei.formula_org_code = ar.org_code
WHEN p_org_tree_type = '1' THEN ei.function_org_code = ar.org_code
WHEN p_org_tree_type = '2' THEN ei.form_org_code = ar.org_code
ELSE ei.formula_org_code = ar.org_code -- 默認使用 formula_org_code
END
WHERE ar.org_code = p_org_code AND ar.org_tree_type = p_org_tree_type AND ei.employed_status = '1';
END;
$$;
ALTER FUNCTION public.get_employees_by_org_code(p_org_code character varying, p_org_tree_type character varying) OWNER TO postgres;
--
-- Name: get_materialized_view_changes_by_date(date, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.get_materialized_view_changes_by_date(p_date date, p_view_name character varying DEFAULT NULL::character varying) RETURNS TABLE(view_name character varying, refreshed_at timestamp with time zone, diff_count integer, diff_details jsonb)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT
mvrl.view_name,
mvrl.refreshed_at,
mvrl.diff_count,
mvrl.diff_details
FROM
materialized_view_refresh_log mvrl
WHERE
DATE(mvrl.refreshed_at) = p_date
AND (p_view_name IS NULL OR mvrl.view_name = p_view_name)
ORDER BY
mvrl.refreshed_at;
END;
$$;
ALTER FUNCTION public.get_materialized_view_changes_by_date(p_date date, p_view_name character varying) OWNER TO postgres;
--
-- Name: get_org_hierarchy_by_org_code(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.get_org_hierarchy_by_org_code(p_org_code character varying, p_org_tree_type character varying) RETURNS TABLE(org_code character varying, org_name character varying, org_tree_type character varying, parent_org_code character varying, level integer)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
WITH RECURSIVE org_hierarchy AS (
-- 基礎案例:從輸入的 org_code 開始
SELECT
ar.org_code,
ar.org_name,
ar.org_tree_type,
ar.parent_org_code,
1 AS level
FROM public.api_organization_relation ar
WHERE ar.org_code = p_org_code AND ar.org_tree_type = p_org_tree_type
UNION ALL
-- 遞迴案例:查找上層組織
SELECT
ar.org_code,
ar.org_name,
ar.org_tree_type,
ar.parent_org_code,
oh.level + 1
FROM public.api_organization_relation ar
JOIN org_hierarchy oh ON ar.org_code = oh.parent_org_code
WHERE ar.org_tree_type = p_org_tree_type
)
SELECT * FROM org_hierarchy
ORDER BY level;
END;
$$;
ALTER FUNCTION public.get_org_hierarchy_by_org_code(p_org_code character varying, p_org_tree_type character varying) OWNER TO postgres;
--
-- Name: refresh_all_materialized_views(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.refresh_all_materialized_views() RETURNS void
LANGUAGE plpgsql
AS $$
DECLARE
v_views TEXT[] := ARRAY['fse7en_org_deptgradeinfo', 'fse7en_org_deptinfo', 'fse7en_org_deptstruct',
'fse7en_org_jobtitle2grade', 'fse7en_org_memberinfo', 'fse7en_org_memberstruct'];
v_view TEXT;
BEGIN
FOREACH v_view IN ARRAY v_views
LOOP
PERFORM refresh_materialized_view_with_log(v_view);
END LOOP;
END;
$$;
ALTER FUNCTION public.refresh_all_materialized_views() OWNER TO postgres;
--
-- Name: refresh_materialized_view_with_log(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.refresh_materialized_view_with_log(p_view_name character varying) RETURNS void
LANGUAGE plpgsql
AS $_$
DECLARE
v_old_data JSONB;
v_new_data JSONB;
v_diff JSONB;
v_diff_count INT;
v_snapshot_table TEXT;
v_row_identifiers TEXT[]; -- 改為陣列,支援複合主鍵
v_compare_condition TEXT;
v_key_fields TEXT;
v_key_json_old TEXT;
v_key_json_new TEXT;
i INT;
BEGIN
-- 建立臨時表存儲更新前的數據快照
v_snapshot_table := 'tmp_' || p_view_name || '_snapshot';
-- 根據視圖名稱確定主鍵或唯一識別欄位(支援複合鍵)
CASE lower(p_view_name)
WHEN 'fse7en_org_deptgradeinfo' THEN v_row_identifiers := ARRAY['grade_id'];
WHEN 'fse7en_org_deptinfo' THEN v_row_identifiers := ARRAY['org_code'];
WHEN 'fse7en_org_deptstruct' THEN v_row_identifiers := ARRAY['org_code'];
WHEN 'fse7en_org_jobtitle2grade' THEN v_row_identifiers := ARRAY['job_title_code'];
WHEN 'fse7en_org_memberinfo' THEN v_row_identifiers := ARRAY['employee_no'];
WHEN 'fse7en_org_memberstruct' THEN v_row_identifiers := ARRAY['employee_no', 'org_code']; -- 複合主鍵
ELSE v_row_identifiers := NULL;
END CASE;
-- 建立臨時表
EXECUTE format('CREATE TEMP TABLE %I ON COMMIT DROP AS SELECT * FROM %I', v_snapshot_table, p_view_name);
-- 更新實體化視圖
EXECUTE format('REFRESH MATERIALIZED VIEW %I', p_view_name);
-- 為複合主鍵構建比較條件
IF v_row_identifiers IS NOT NULL THEN
v_compare_condition := '';
v_key_fields := '';
v_key_json_old := '';
v_key_json_new := '';
FOR i IN 1..array_length(v_row_identifiers, 1) LOOP
-- 構建比較條件
IF i > 1 THEN
v_compare_condition := v_compare_condition || ' AND ';
v_key_fields := v_key_fields || ', ';
v_key_json_old := v_key_json_old || ', ';
v_key_json_new := v_key_json_new || ', ';
END IF;
v_compare_condition := v_compare_condition || format('o.%1$I = n.%1$I', v_row_identifiers[i]);
v_key_fields := v_key_fields || format('o.%1$I', v_row_identifiers[i]);
v_key_json_old := v_key_json_old || format('''%1$I'', d.old_data->>''%1$I''', v_row_identifiers[i]);
v_key_json_new := v_key_json_new || format('''%1$I'', d.new_data->>''%1$I''', v_row_identifiers[i]);
END LOOP;
END IF;
-- 計算差異
IF v_row_identifiers IS NULL THEN
-- 沒有唯一識別欄位,使用整行比較
EXECUTE format('
WITH diff_data AS (
-- 刪除的記錄
SELECT
''DELETE'' as operation,
row_to_json(o)::jsonb as old_data,
NULL::jsonb as new_data
FROM
%I o
WHERE
NOT EXISTS (
SELECT 1 FROM %I n
WHERE row_to_json(o)::jsonb = row_to_json(n)::jsonb
)
UNION ALL
-- 插入的記錄
SELECT
''INSERT'' as operation,
NULL::jsonb as old_data,
row_to_json(n)::jsonb as new_data
FROM
%I n
WHERE
NOT EXISTS (
SELECT 1 FROM %I o
WHERE row_to_json(o)::jsonb = row_to_json(n)::jsonb
)
)
SELECT
jsonb_agg(d.old_data) FILTER (WHERE d.operation = ''DELETE''),
jsonb_agg(d.new_data) FILTER (WHERE d.operation = ''INSERT''),
jsonb_agg(
CASE
WHEN d.operation = ''DELETE'' THEN jsonb_build_object(''operation'', d.operation, ''data'', d.old_data)
WHEN d.operation = ''INSERT'' THEN jsonb_build_object(''operation'', d.operation, ''data'', d.new_data)
END
),
COUNT(*)
FROM
diff_data d',
v_snapshot_table,
p_view_name,
p_view_name,
v_snapshot_table
)
INTO v_old_data, v_new_data, v_diff, v_diff_count;
ELSE
-- 使用複合鍵進行比較
EXECUTE format('
WITH diff_data AS (
-- 刪除的記錄
SELECT
''DELETE'' as operation,
row_to_json(o)::jsonb as old_data,
NULL::jsonb as new_data
FROM
%I o
WHERE
NOT EXISTS (
SELECT 1 FROM %I n
WHERE %s
)
UNION ALL
-- 插入的記錄
SELECT
''INSERT'' as operation,
NULL::jsonb as old_data,
row_to_json(n)::jsonb as new_data
FROM
%I n
WHERE
NOT EXISTS (
SELECT 1 FROM %I o
WHERE %s
)
UNION ALL
-- 更新的記錄
SELECT
''UPDATE'' as operation,
row_to_json(o)::jsonb as old_data,
row_to_json(n)::jsonb as new_data
FROM
%I o
JOIN
%I n ON %s
WHERE
row_to_json(o)::jsonb <> row_to_json(n)::jsonb
)
SELECT
jsonb_agg(d.old_data) FILTER (WHERE d.operation IN (''DELETE'', ''UPDATE'')),
jsonb_agg(d.new_data) FILTER (WHERE d.operation IN (''INSERT'', ''UPDATE'')),
jsonb_agg(
CASE
WHEN d.operation = ''DELETE'' THEN jsonb_build_object(''operation'', d.operation, ''key'', jsonb_build_object(%s), ''data'', d.old_data)
WHEN d.operation = ''INSERT'' THEN jsonb_build_object(''operation'', d.operation, ''key'', jsonb_build_object(%s), ''data'', d.new_data)
ELSE jsonb_build_object(''operation'', d.operation, ''key'', jsonb_build_object(%s), ''old'', d.old_data, ''new'', d.new_data)
END
),
COUNT(*)
FROM
diff_data d',
v_snapshot_table,
p_view_name,
v_compare_condition,
p_view_name,
v_snapshot_table,
v_compare_condition,
v_snapshot_table,
p_view_name,
v_compare_condition,
v_key_json_old,
v_key_json_new,
v_key_json_old
)
INTO v_old_data, v_new_data, v_diff, v_diff_count;
END IF;
-- 記錄變更
INSERT INTO materialized_view_refresh_log(view_name, refreshed_at, diff_count, diff_details)
VALUES (p_view_name, CURRENT_TIMESTAMP, COALESCE(v_diff_count, 0), v_diff);
END;
$_$;
ALTER FUNCTION public.refresh_materialized_view_with_log(p_view_name character varying) OWNER TO postgres;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: api_company; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_company (
id bigint NOT NULL,
company_code character varying(20),
company_name character varying(50),
company_partyid bigint,
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
effective_date timestamp with time zone,
status character varying(2),
tenantid character varying(20)
);
ALTER TABLE public.api_company OWNER TO postgres;
--
-- Name: api_company_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_company_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_company_id_seq OWNER TO postgres;
--
-- Name: api_company_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_company_id_seq OWNED BY public.api_company.id;
--
-- Name: api_employee_info; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_employee_info (
id bigint NOT NULL,
arcidno character varying(20),
company_code character varying(20),
company_name character varying(50),
company_partyid bigint,
country_code character varying(10),
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
date_of_birth timestamp with time zone,
email_address character varying(50),
employed_status character varying(2),
employee_no character varying(10),
employee_type_code character varying(10),
employee_type_name character varying(20),
english_name character varying(50),
ext_no character varying(10),
form_org_code character varying(20),
form_org_name character varying(50),
form_org_partyid bigint,
formula_org_code character varying(20),
formula_org_name character varying(50),
formula_org_partyid bigint,
full_name character varying(50),
function_org_code character varying(20),
function_org_name character varying(50),
gender_code character varying(2),
gender_name character varying(10),
hire_date timestamp with time zone,
idno character varying(20),
idno_suffix character varying(10),
job_flag character varying(2),
job_grade_code character varying(10),
job_grade_name character varying(20),
job_level_code character varying(10),
job_level_name character varying(20),
job_title_code character varying(10),
job_title_name character varying(20),
mobile_phone_no character varying(20),
mvpn character varying(20),
office_phone character varying(20),
party_roleid bigint,
passport_no character varying(30),
permanent_address character varying(50),
permanent_phone_no character varying(20),
permanent_zip_code character varying(10),
position_code character varying(10),
position_name character varying(20),
present_address character varying(50),
present_phone_no character varying(20),
present_zip_code character varying(10),
resignation_date timestamp with time zone,
status character varying(2),
tenantid character varying(10),
userid character varying(10)
);
ALTER TABLE public.api_employee_info OWNER TO postgres;
--
-- Name: api_employee_info_action_log; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_employee_info_action_log (
id bigint NOT NULL,
action character varying(10),
action_date timestamp with time zone,
created_date timestamp with time zone NOT NULL,
employee_no character varying(10) NOT NULL,
field_name character varying(30) NOT NULL,
new_value character varying(50),
old_value character varying(50),
party_roleid bigint
);
ALTER TABLE public.api_employee_info_action_log OWNER TO postgres;
--
-- Name: api_employee_info_action_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_employee_info_action_log_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_employee_info_action_log_id_seq OWNER TO postgres;
--
-- Name: api_employee_info_action_log_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_employee_info_action_log_id_seq OWNED BY public.api_employee_info_action_log.id;
--
-- Name: api_employee_info_archived; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_employee_info_archived (
id bigint NOT NULL,
arcidno character varying(20),
company_code character varying(20),
company_name character varying(50),
company_partyid bigint,
country_code character varying(10),
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
date_of_birth timestamp with time zone,
email_address character varying(50),
employed_status character varying(2),
employee_no character varying(10),
employee_type_code character varying(10),
employee_type_name character varying(20),
english_name character varying(50),
ext_no character varying(10),
form_org_code character varying(20),
form_org_name character varying(50),
form_org_partyid bigint,
formula_org_code character varying(20),
formula_org_name character varying(50),
formula_org_partyid bigint,
full_name character varying(20),
function_org_code character varying(20),
function_org_name character varying(50),
gender_code character varying(2),
gender_name character varying(10),
hire_date timestamp with time zone,
idno character varying(20),
idno_suffix character varying(10),
job_flag character varying(2),
job_grade_code character varying(10),
job_grade_name character varying(20),
job_level_code character varying(10),
job_level_name character varying(20),
job_title_code character varying(10),
job_title_name character varying(20),
mobile_phone_no character varying(20),
mvpn character varying(20),
office_phone character varying(20),
party_roleid bigint,
passport_no character varying(30),
permanent_address character varying(50),
permanent_phone_no character varying(20),
permanent_zip_code character varying(10),
position_code character varying(10),
position_name character varying(20),
present_address character varying(50),
present_phone_no character varying(20),
present_zip_code character varying(10),
resignation_date timestamp with time zone,
status character varying(2),
tenantid character varying(10),
userid character varying(10)
);
ALTER TABLE public.api_employee_info_archived OWNER TO postgres;
--
-- Name: api_employee_info_archived_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_employee_info_archived_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_employee_info_archived_id_seq OWNER TO postgres;
--
-- Name: api_employee_info_archived_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_employee_info_archived_id_seq OWNED BY public.api_employee_info_archived.id;
--
-- Name: api_employee_info_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_employee_info_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_employee_info_id_seq OWNER TO postgres;
--
-- Name: api_employee_info_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_employee_info_id_seq OWNED BY public.api_employee_info.id;
--
-- Name: api_organization; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization (
id bigint NOT NULL,
address character varying(50),
company_code character varying(20),
company_name character varying(50),
company_partyid bigint,
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
email character varying(50),
end_date timestamp with time zone,
english_name character varying(50),
fax character varying(10),
layer_code character varying(5),
layer_name character varying(20),
org_code character varying(20),
org_name character varying(50),
org_property_code character varying(2),
organizationid bigint,
remark character varying(20),
sort_sequence integer,
start_date timestamp with time zone,
status character varying(2),
telephone character varying(20),
tenantid character varying(10)
);
ALTER TABLE public.api_organization OWNER TO postgres;
--
-- Name: api_organization_action_log; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization_action_log (
id bigint NOT NULL,
action character varying(10),
action_date timestamp with time zone,
created_date timestamp with time zone NOT NULL,
field_name character varying(30) NOT NULL,
new_value character varying(50),
old_value character varying(50),
org_code character varying(20) NOT NULL,
organizationid bigint
);
ALTER TABLE public.api_organization_action_log OWNER TO postgres;
--
-- Name: api_organization_action_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_action_log_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_action_log_id_seq OWNER TO postgres;
--
-- Name: api_organization_action_log_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_action_log_id_seq OWNED BY public.api_organization_action_log.id;
--
-- Name: api_organization_archived; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization_archived (
id bigint NOT NULL,
address character varying(50),
company_code character varying(20),
company_name character varying(50),
company_partyid bigint,
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
email character varying(50),
end_date timestamp with time zone,
english_name character varying(50),
fax character varying(10),
layer_code character varying(5),
layer_name character varying(20),
org_code character varying(20),
org_name character varying(50),
org_property_code character varying(2),
organizationid bigint,
remark character varying(20),
sort_sequence integer,
start_date timestamp with time zone,
status character varying(2),
telephone character varying(20),
tenantid character varying(10)
);
ALTER TABLE public.api_organization_archived OWNER TO postgres;
--
-- Name: api_organization_archived_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_archived_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_archived_id_seq OWNER TO postgres;
--
-- Name: api_organization_archived_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_archived_id_seq OWNED BY public.api_organization_archived.id;
--
-- Name: api_organization_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_id_seq OWNER TO postgres;
--
-- Name: api_organization_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_id_seq OWNED BY public.api_organization.id;
--
-- Name: api_organization_manager; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization_manager (
id bigint NOT NULL,
company_code character varying(20),
company_partyid bigint,
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
effective_date timestamp with time zone,
employee_no character varying(10),
end_date timestamp with time zone,
full_name character varying(20),
is_deputy boolean,
manager_role_type character varying(2),
org_code character varying(20),
organization_managerid bigint,
status character varying(2),
tenantid character varying(10)
);
ALTER TABLE public.api_organization_manager OWNER TO postgres;
--
-- Name: api_organization_manager_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_manager_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_manager_id_seq OWNER TO postgres;
--
-- Name: api_organization_manager_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_manager_id_seq OWNED BY public.api_organization_manager.id;
--
-- Name: api_organization_relation; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization_relation (
id bigint NOT NULL,
company_code character varying(20),
company_party_id bigint,
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
org_code character varying(20),
org_name character varying(50),
org_tree_type character varying(2),
organization_relation_id bigint,
parent_org_code character varying(20),
status character varying(2),
tenant_id character varying(10)
);
ALTER TABLE public.api_organization_relation OWNER TO postgres;
--
-- Name: api_organization_relation_action_log; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization_relation_action_log (
id bigint NOT NULL,
action character varying(10) NOT NULL,
action_date timestamp with time zone NOT NULL,
created_date timestamp with time zone NOT NULL,
field_name character varying(30) NOT NULL,
is_sync boolean,
new_value character varying(50),
old_value character varying(50),
org_code character varying(20) NOT NULL,
organization_relation_id bigint
);
ALTER TABLE public.api_organization_relation_action_log OWNER TO postgres;
--
-- Name: api_organization_relation_action_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_relation_action_log_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_relation_action_log_id_seq OWNER TO postgres;
--
-- Name: api_organization_relation_action_log_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_relation_action_log_id_seq OWNED BY public.api_organization_relation_action_log.id;
--
-- Name: api_organization_relation_archived; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.api_organization_relation_archived (
id bigint NOT NULL,
archived_date timestamp with time zone,
company_code character varying(20),
company_party_id bigint,
created_date timestamp with time zone,
data_created_date timestamp with time zone,
data_created_user character varying(30),
data_modified_date timestamp with time zone,
data_modified_user character varying(30),
org_code character varying(20),
org_name character varying(50),
org_tree_type character varying(2),
organization_relation_id bigint,
parent_org_code character varying(20),
status character varying(2),
tenant_id character varying(10)
);
ALTER TABLE public.api_organization_relation_archived OWNER TO postgres;
--
-- Name: api_organization_relation_archived_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_relation_archived_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_relation_archived_id_seq OWNER TO postgres;
--
-- Name: api_organization_relation_archived_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_relation_archived_id_seq OWNED BY public.api_organization_relation_archived.id;
--
-- Name: api_organization_relation_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.api_organization_relation_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.api_organization_relation_id_seq OWNER TO postgres;
--
-- Name: api_organization_relation_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.api_organization_relation_id_seq OWNED BY public.api_organization_relation.id;
--
-- Name: fse7en_org_deptgradeinfo; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres
--
CREATE MATERIALIZED VIEW public.fse7en_org_deptgradeinfo AS
SELECT DISTINCT ('Level'::text || ( SELECT count(*) AS count
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level))) AS grade_id,
(('第'::text || ( SELECT count(*) AS count
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level))) || '階'::text) AS display_name,
('-'::text || ( SELECT count(*) AS count
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level))) AS grade_num
FROM (public.api_organization_relation aor
JOIN public.api_organization ao ON (((aor.org_code)::text = (ao.org_code)::text)))
WHERE ((aor.org_tree_type)::text = '0'::text)
ORDER BY ('Level'::text || ( SELECT count(*) AS count
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level)))
WITH NO DATA;
ALTER TABLE public.fse7en_org_deptgradeinfo OWNER TO postgres;
--
-- Name: fse7en_org_deptinfo; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres
--
CREATE MATERIALIZED VIEW public.fse7en_org_deptinfo AS
SELECT ao.org_code,
ao.org_name
FROM (public.api_organization ao
JOIN public.api_organization_relation aor ON (((ao.org_code)::text = (aor.org_code)::text)))
WHERE ((aor.org_tree_type)::text = '0'::text)
ORDER BY ao.org_code
WITH NO DATA;
ALTER TABLE public.fse7en_org_deptinfo OWNER TO postgres;
--
-- Name: fse7en_org_deptstruct; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres
--
CREATE MATERIALIZED VIEW public.fse7en_org_deptstruct AS
SELECT aor.org_code,
aor.parent_org_code,
('Level'::text || ( SELECT count(*) AS count
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level))) AS grade_id,
('-'::text || ( SELECT count(*) AS count
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level))) AS grade_num,
( SELECT get_org_hierarchy_by_org_code.org_code
FROM public.get_org_hierarchy_by_org_code(aor.org_code, '0'::character varying) get_org_hierarchy_by_org_code(org_code, org_name, org_tree_type, parent_org_code, level)
WHERE (get_org_hierarchy_by_org_code.parent_org_code IS NULL)) AS top_orgtree_code
FROM (public.api_organization_relation aor
JOIN public.api_organization ao ON (((aor.org_code)::text = (ao.org_code)::text)))
WHERE ((aor.org_tree_type)::text = '0'::text)
ORDER BY aor.org_code
WITH NO DATA;
ALTER TABLE public.fse7en_org_deptstruct OWNER TO postgres;
--
-- Name: fse7en_org_jobtitle2grade; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres
--
CREATE MATERIALIZED VIEW public.fse7en_org_jobtitle2grade AS
SELECT DISTINCT (aei.job_title_code)::character varying AS job_title_code,
aei.job_title_name,
regexp_replace(((aei.job_title_code)::character varying)::text, '[A-Za-z]'::text, ''::text, 'g'::text) AS job_grade
FROM public.api_employee_info aei
WHERE (aei.job_title_code IS NOT NULL)
ORDER BY (aei.job_title_code)::character varying DESC
WITH NO DATA;
ALTER TABLE public.fse7en_org_jobtitle2grade OWNER TO postgres;
--
-- Name: fse7en_org_memberinfo; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres
--
CREATE MATERIALIZED VIEW public.fse7en_org_memberinfo AS
SELECT DISTINCT api_employee_info.employee_no,
api_employee_info.full_name,
api_employee_info.ext_no,
api_employee_info.email_address,
CASE
WHEN ((api_employee_info.employed_status)::text = '1'::text) THEN '0'::text
ELSE '1'::text
END AS isterminated,
api_employee_info.hire_date,
api_employee_info.email_address AS azureaccount,
CASE
WHEN api_employee_info.job_flag IN ('1', '4') THEN 'BU'
WHEN api_employee_info.job_flag IS NULL THEN null
ELSE 'ADM'
END as job_flag
FROM public.api_employee_info
ORDER BY
CASE
WHEN ((api_employee_info.employed_status)::text = '1'::text) THEN '0'::text
ELSE '1'::text
END, api_employee_info.employee_no
WITH NO DATA;
ALTER TABLE public.fse7en_org_memberinfo OWNER TO postgres;
--
-- Name: fse7en_org_memberstruct; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres
--
CREATE MATERIALIZED VIEW public.fse7en_org_memberstruct AS
WITH RECURSIVE employee_managers AS (
SELECT aei_1.employee_no,
aei_1.full_name,
aei_1.form_org_code,
aei_1.form_org_name,
aei_1.formula_org_code,
aei_1.formula_org_name,
aei_1.job_title_code,
aei_1.employed_status,
-- 修正:排除自己當主管的情況,並確保主管在職狀態
( SELECT aom_1.employee_no
FROM api_organization_manager aom_1
JOIN api_employee_info aei_mgr ON aom_1.employee_no = aei_mgr.employee_no
WHERE aom_1.org_code::text = aei_1.form_org_code::text
AND aom_1.employee_no::text <> aei_1.employee_no::text
AND aei_mgr.employed_status in ('1', '2') -- 主管在職狀態
ORDER BY aom_1.effective_date DESC
LIMIT 1) AS direct_manager_employee_no,
-- 找上層組織
( SELECT aor.parent_org_code
FROM api_organization_relation aor
WHERE aor.org_code::text = aei_1.form_org_code::text
AND aor.org_tree_type::text = '2'::text
LIMIT 1) AS parent_org_code
FROM api_employee_info aei_1
), org_hierarchy AS (
-- 遞迴查找組織階層,直到找到不是自己的主管
SELECT
em.employee_no,
em.form_org_code as current_org_code,
em.parent_org_code,
1 as level
FROM employee_managers em
UNION ALL
SELECT
oh.employee_no,
oh.parent_org_code as current_org_code,
( SELECT aor.parent_org_code
FROM api_organization_relation aor
WHERE aor.org_code::text = oh.parent_org_code::text
AND aor.org_tree_type::text = '2'::text
LIMIT 1) as parent_org_code,
oh.level + 1
FROM org_hierarchy oh
WHERE oh.parent_org_code IS NOT NULL
AND oh.level < 10 -- 防止無限遞迴
), employee_with_approve_right AS (
SELECT em.employee_no,
em.full_name,
em.form_org_code,
em.form_org_name,
em.formula_org_code,
em.formula_org_name,
em.job_title_code,
em.employed_status,
CASE
-- 先檢查是否有直屬主管(不是自己且在職)
WHEN em.direct_manager_employee_no IS NOT NULL
THEN em.direct_manager_employee_no
-- 如果沒有,則遞迴往上找組織主管(不是自己且在職)
ELSE ( SELECT aom.employee_no
FROM org_hierarchy oh
JOIN api_organization_manager aom ON aom.org_code::text = oh.current_org_code::text
JOIN api_employee_info aei_mgr ON aom.employee_no = aei_mgr.employee_no
WHERE oh.employee_no = em.employee_no
AND aom.employee_no::text <> em.employee_no::text
AND aei_mgr.employed_status in ('1', '2') -- 主管在職狀態
ORDER BY oh.level ASC, aom.effective_date DESC
LIMIT 1)
END AS approval_manager_employee_no
FROM employee_managers em
)
SELECT DISTINCT aei.employee_no,
aei.full_name,
aei.formula_org_code AS org_code,
aei.formula_org_name AS org_name,
aei.job_title_code,
regexp_replace(aei.job_title_code::character varying::text, '[A-Za-z]'::text, ''::text, 'g'::text) AS job_grade,
CASE
WHEN aom.manager_role_type IS NULL THEN '1'::text
WHEN aom.manager_role_type::text = '1'::text OR aom.manager_role_type::text = ''::text THEN '1'::text
ELSE '0'::text
END AS is_main_job,
CASE
WHEN (EXISTS ( SELECT 1
FROM employee_with_approve_right ewar
WHERE ewar.approval_manager_employee_no::text = aei.employee_no::text)) THEN '1'::text
ELSE '0'::text
END AS approve_right,
CASE
WHEN aei.employed_status::text = '1'::text THEN '1'::text
ELSE '0'::text
END AS enable,
-- 修正 instructor:主管員工編號@主管的formula_org_code,確保主管在職
( SELECT CASE
WHEN ewar.approval_manager_employee_no IS NOT NULL
THEN (ewar.approval_manager_employee_no::text || '@'::text) || a2.formula_org_code::text
ELSE NULL
END
FROM employee_with_approve_right ewar
LEFT JOIN api_employee_info a2 ON ewar.approval_manager_employee_no::text = a2.employee_no::text
WHERE ewar.employee_no::text = aei.employee_no::text
AND a2.employed_status in ('1', '2') -- 最終確認主管在職狀態
ORDER BY aom.effective_date DESC -- 按生效日期排序,取最近的
LIMIT 1) AS instructor
FROM api_employee_info aei
LEFT JOIN api_organization_manager aom ON aei.employee_no::text = aom.employee_no::text
LEFT JOIN api_organization ao ON aei.form_org_code::text = ao.org_code::text
WHERE
CASE
WHEN aom.manager_role_type IS NULL THEN '1'::text
WHEN aom.manager_role_type::text = '1'::text OR aom.manager_role_type::text = ''::text THEN '1'::text
ELSE '0'::text
END = '1'::text
ORDER BY
aei.employee_no
WITH NO DATA;
ALTER TABLE public.fse7en_org_memberstruct OWNER TO postgres;
--
-- Name: materialized_view_refresh_log; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.materialized_view_refresh_log (
id bigint NOT NULL,
view_name character varying(255) NOT NULL,
refreshed_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
diff_count integer,
diff_details jsonb
);
ALTER TABLE public.materialized_view_refresh_log OWNER TO postgres;
--
-- Name: materialized_view_refresh_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.materialized_view_refresh_log_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.materialized_view_refresh_log_id_seq OWNER TO postgres;
--
-- Name: materialized_view_refresh_log_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.materialized_view_refresh_log_id_seq OWNED BY public.materialized_view_refresh_log.id;
--
-- Name: api_company id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_company ALTER COLUMN id SET DEFAULT nextval('public.api_company_id_seq'::regclass);
--
-- Name: api_employee_info id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_employee_info ALTER COLUMN id SET DEFAULT nextval('public.api_employee_info_id_seq'::regclass);
--
-- Name: api_employee_info_action_log id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_employee_info_action_log ALTER COLUMN id SET DEFAULT nextval('public.api_employee_info_action_log_id_seq'::regclass);
--
-- Name: api_employee_info_archived id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_employee_info_archived ALTER COLUMN id SET DEFAULT nextval('public.api_employee_info_archived_id_seq'::regclass);
--
-- Name: api_organization id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization ALTER COLUMN id SET DEFAULT nextval('public.api_organization_id_seq'::regclass);
--
-- Name: api_organization_action_log id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_action_log ALTER COLUMN id SET DEFAULT nextval('public.api_organization_action_log_id_seq'::regclass);
--
-- Name: api_organization_archived id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_archived ALTER COLUMN id SET DEFAULT nextval('public.api_organization_archived_id_seq'::regclass);
--
-- Name: api_organization_manager id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_manager ALTER COLUMN id SET DEFAULT nextval('public.api_organization_manager_id_seq'::regclass);
--
-- Name: api_organization_relation id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_relation ALTER COLUMN id SET DEFAULT nextval('public.api_organization_relation_id_seq'::regclass);
--
-- Name: api_organization_relation_action_log id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_relation_action_log ALTER COLUMN id SET DEFAULT nextval('public.api_organization_relation_action_log_id_seq'::regclass);
--
-- Name: api_organization_relation_archived id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_relation_archived ALTER COLUMN id SET DEFAULT nextval('public.api_organization_relation_archived_id_seq'::regclass);
--
-- Name: materialized_view_refresh_log id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.materialized_view_refresh_log ALTER COLUMN id SET DEFAULT nextval('public.materialized_view_refresh_log_id_seq'::regclass);
--
-- Name: api_company api_company_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_company
ADD CONSTRAINT api_company_pkey PRIMARY KEY (id);
--
-- Name: api_employee_info_action_log api_employee_info_action_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_employee_info_action_log
ADD CONSTRAINT api_employee_info_action_log_pkey PRIMARY KEY (id);
--
-- Name: api_employee_info_archived api_employee_info_archived_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_employee_info_archived
ADD CONSTRAINT api_employee_info_archived_pkey PRIMARY KEY (id);
--
-- Name: api_employee_info api_employee_info_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_employee_info
ADD CONSTRAINT api_employee_info_pkey PRIMARY KEY (id);
--
-- Name: api_organization_action_log api_organization_action_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_action_log
ADD CONSTRAINT api_organization_action_log_pkey PRIMARY KEY (id);
--
-- Name: api_organization_archived api_organization_archived_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_archived
ADD CONSTRAINT api_organization_archived_pkey PRIMARY KEY (id);
--
-- Name: api_organization_manager api_organization_manager_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_manager
ADD CONSTRAINT api_organization_manager_pkey PRIMARY KEY (id);
--
-- Name: api_organization api_organization_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization
ADD CONSTRAINT api_organization_pkey PRIMARY KEY (id);
--
-- Name: api_organization_relation_action_log api_organization_relation_action_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_relation_action_log
ADD CONSTRAINT api_organization_relation_action_log_pkey PRIMARY KEY (id);
--
-- Name: api_organization_relation_archived api_organization_relation_archived_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_relation_archived
ADD CONSTRAINT api_organization_relation_archived_pkey PRIMARY KEY (id);
--
-- Name: api_organization_relation api_organization_relation_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization_relation
ADD CONSTRAINT api_organization_relation_pkey PRIMARY KEY (id);
--
-- Name: materialized_view_refresh_log materialized_view_refresh_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.materialized_view_refresh_log
ADD CONSTRAINT materialized_view_refresh_log_pkey PRIMARY KEY (id);
--
-- Name: api_organization uk_s4lkcneefc2dlhaxcbhi5a8s0; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.api_organization
ADD CONSTRAINT uk_s4lkcneefc2dlhaxcbhi5a8s0 UNIQUE (org_code);
--
-- Name: idx_fse7en_org_deptgradeinfo_grade_id; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX idx_fse7en_org_deptgradeinfo_grade_id ON public.fse7en_org_deptgradeinfo USING btree (grade_id);
--
-- Name: idx_fse7en_org_deptinfo_org_code; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX idx_fse7en_org_deptinfo_org_code ON public.fse7en_org_deptinfo USING btree (org_code);
--
-- Name: idx_fse7en_org_deptstruct_org_code; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX idx_fse7en_org_deptstruct_org_code ON public.fse7en_org_deptstruct USING btree (org_code);
--
-- Name: idx_fse7en_org_jobtitle2grade_code; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX idx_fse7en_org_jobtitle2grade_code ON public.fse7en_org_jobtitle2grade USING btree (job_title_code);
--
-- Name: idx_fse7en_org_memberinfo_employee_no; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX idx_fse7en_org_memberinfo_employee_no ON public.fse7en_org_memberinfo USING btree (employee_no);
--
-- Name: idx_fse7en_org_memberstruct_emp_org; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX idx_fse7en_org_memberstruct_emp_org ON public.fse7en_org_memberstruct USING btree (employee_no, org_code);
--
-- PostgreSQL database dump complete
--
CREATE TABLE public.approved_amount_for_each_layer (
layer_code character varying(10) NOT NULL,
layer_description character varying(20),
max_capital_fee NUMERIC(18, 2),
max_expense_fee NUMERIC(18, 2),
max_payment_penalty_fee NUMERIC(18, 2),
max_payment_relation_fee NUMERIC(18, 2),
max_payment_current_capital_fee NUMERIC(18, 2),
max_payment_regular_expense_fee NUMERIC(18, 2),
max_payment_other_capital_fee NUMERIC(18, 2),
max_payment_other_expense_fee NUMERIC(18, 2)
);
ALTER TABLE public.approved_amount_for_each_layer OWNER TO postgres;
insert into public.approved_amount_for_each_layer values('0', '董事長', 999999999, 999999999, 999999999, 999999999, 0, 0, 999999999, 999999999);
insert into public.approved_amount_for_each_layer values('1', '總經理', 5000000, 2500000, 2500000, 300000, 0, 0, 5000000, 2500000);
insert into public.approved_amount_for_each_layer values('2', '本部主管', 1000000, 500000, 500000, 50000, 0, 0, 1000000, 500000);
insert into public.approved_amount_for_each_layer values('3', '店內店長主管.總公司部級主管', 500000, 250000, 100000, 20000, 999999999, 999999999, 500000, 250000);
insert into public.approved_amount_for_each_layer values('4', '店內部級主管.總公司課級主管', 100000, 50000, 20000, 10000, 200000, 100000, 100000, 50000);
insert into public.approved_amount_for_each_layer values('5', '店內課級主管', 0, 10000, 0, 0, 0, 20000, 0, 10000);
CREATE OR REPLACE VIEW public.view_employee_approval_amount AS
SELECT
DISTINCT
emp.employee_no,
emp.full_name,
emp.job_title_code,
emp.job_title_name,
form_org.layer_code,
form_org.layer_name,
approvedAmount.layer_description,
formula_org.org_code AS formula_org_code,
formula_org.org_name AS formula_org_name,
form_org.org_code AS form_org_code,
form_org.org_name AS form_org_name,
approvedAmount.max_capital_fee,
approvedAmount.max_expense_fee,
approvedAmount.max_payment_penalty_fee,
approvedAmount.max_payment_relation_fee,
approvedAmount.max_payment_current_capital_fee,
approvedAmount.max_payment_regular_expense_fee,
approvedAmount.max_payment_other_capital_fee,
approvedAmount.max_payment_other_expense_fee
FROM
public.api_employee_info emp
LEFT JOIN
public.api_organization form_org ON emp.form_org_code = form_org.org_code
LEFT JOIN
public.api_organization formula_org ON emp.formula_org_code = formula_org.org_code
LEFT JOIN
public.FSe7en_Org_MemberStruct memberStruct ON emp.employee_no = memberStruct.employee_no
LEFT JOIN
public.approved_amount_for_each_layer approvedAmount ON form_org.layer_code = approvedAmount.layer_code
where emp.employed_status in ('1', '2') and memberStruct.approve_right='1'
order by layer_code;
REFRESH MATERIALIZED VIEW fse7en_org_deptgradeinfo;
REFRESH MATERIALIZED VIEW fse7en_org_deptinfo;
REFRESH MATERIALIZED VIEW fse7en_org_deptstruct;
REFRESH MATERIALIZED VIEW fse7en_org_jobtitle2grade;
REFRESH MATERIALIZED VIEW fse7en_org_memberinfo;
REFRESH MATERIALIZED VIEW fse7en_org_memberstruct;
--EHR_EMPLOYEE
CREATE OR REPLACE VIEW view_core_ehr_employee AS
SELECT
employee_no,
full_name,
formula_org_code,
job_title_code,
job_title_name,
position_code,
job_grade_code,
job_level_code,
to_char(hire_date, 'yyyy-MM-dd') as hire_date,
to_char(resignation_date, 'yyyy-MM-dd') as resignation_date,
(
SELECT
manager_employee_no
FROM
Find_approval_manager(employee_no, '0')
) AS manager_employee_no,
(
SELECT
manager_full_name
FROM
Find_approval_manager(employee_no, '0')
) AS manager_full_name,
employed_status,
email_address
FROM
api_employee_info ami;
--EHR_DEPARTMENT
CREATE OR REPLACE VIEW view_core_ehr_department AS
select
ao.org_code,
ao.org_name as org_abbr_name,
ao.org_name,
(
select
employee_no
from
api_organization_manager
where
manager_role_type is null
or manager_role_type = ''
and org_code = aor.parent_org_code
order by
effective_date desc
limit
1
) as manager_employee_no,
(
select
full_name
from
api_organization_manager
where
manager_role_type is null
or manager_role_type = ''
and org_code = aor.parent_org_code
order by
effective_date desc
limit
1
) as manager_full_name,
aor.parent_org_code as parent_org_code,
to_char(ao.start_date, 'yyyy-MM-dd') as start_date,
to_char(ao.end_date, 'yyyy-MM-dd') as end_date,
false as is_virtual
from
api_organization ao
left outer join api_organization_relation aor on ao.org_code = aor.org_code
and aor.org_tree_type = '0';