CREATE TABLE public.mst_sub_fungsi (
    id_sub_fungsi serial NOT NULL,
    tahun integer DEFAULT 0 NOT NULL,
    id_fungsi integer DEFAULT 0 NOT NULL,
    id_unik_sub_fungsi uuid DEFAULT public.uuid_generate_v7() NOT NULL,
    id_unik_fungsi uuid DEFAULT '00000000-0000-0000-0000-000000000000' NOT NULL,
    locked boolean DEFAULT false NOT NULL,
    disable boolean DEFAULT false NOT NULL,
    jns_pemda integer[] DEFAULT ARRAY[0] NOT NULL,
    daerah_khusus integer[] DEFAULT ARRAY[0] NOT NULL,
    kode_sub_fungsi character varying(25) NOT NULL,
    nama_sub_fungsi text DEFAULT ''::text NOT NULL,
    hist_data jsonb DEFAULT '[]'::jsonb NOT NULL,
    created_at timestamp(6) without time zone DEFAULT now() NOT NULL,
    created_by integer DEFAULT 0 NOT NULL,
    updated_at timestamp(6) without time zone DEFAULT '0001-01-01 00:00:00'::timestamp without time zone NOT NULL,
    updated_by integer DEFAULT 0 NOT NULL,
    deleted_at timestamp(6) without time zone DEFAULT '0001-01-01 00:00:00'::timestamp without time zone NOT NULL,
    deleted_by integer DEFAULT 0 NOT NULL
);

COMMENT ON TABLE public.mst_sub_fungsi IS 'Tabel referensi sub fungsi dalam sistem public/SIPD. Menyimpan informasi sub fungsi yang merupakan turunan dari fungsi utama, digunakan untuk pengelompokan urusan pemerintahan, perencanaan, dan penganggaran.';
COMMENT ON COLUMN public.mst_sub_fungsi.id_sub_fungsi IS 'Primary key. ID unik untuk setiap sub fungsi.';
COMMENT ON COLUMN public.mst_sub_fungsi.tahun IS 'Tahun berlakunya sub fungsi.';
COMMENT ON COLUMN public.mst_sub_fungsi.id_fungsi IS 'ID fungsi induk yang menaungi sub fungsi ini.';
COMMENT ON COLUMN public.mst_sub_fungsi.id_unik_sub_fungsi IS 'ID unik UUID untuk backup ID primary key.';
COMMENT ON COLUMN public.mst_sub_fungsi.id_unik_fungsi IS 'ID unik UUID untuk backup ID foreign key mst_fungsi.';
COMMENT ON COLUMN public.mst_sub_fungsi.locked IS 'Status kunci data. TRUE berarti data terkunci dan tidak dapat diubah.';
COMMENT ON COLUMN public.mst_sub_fungsi.disable IS 'Status nonaktif. TRUE berarti sub fungsi tidak digunakan.';
COMMENT ON COLUMN public.mst_sub_fungsi.jns_pemda IS 'Daftar jenis pemerintah daerah dalam bentuk array (1=Provinsi, 2=Kabupaten, 3=Kota).';
COMMENT ON COLUMN public.mst_sub_fungsi.daerah_khusus IS 'Daftar ID daerah khusus dalam bentuk array (440=Papua, 528=Papua Barat).';
COMMENT ON COLUMN public.mst_sub_fungsi.kode_sub_fungsi IS 'Kode unik sub fungsi sesuai klasifikasi fungsi.';
COMMENT ON COLUMN public.mst_sub_fungsi.nama_sub_fungsi IS 'Nama lengkap sub fungsi.';
COMMENT ON COLUMN public.mst_sub_fungsi.hist_data IS 'Riwayat perubahan data sub fungsi dalam format JSONB.';
COMMENT ON COLUMN public.mst_sub_fungsi.created_at IS 'Tanggal dan waktu pertama kali data dibuat.';
COMMENT ON COLUMN public.mst_sub_fungsi.created_by IS 'ID pengguna yang membuat data pertama kali.';
COMMENT ON COLUMN public.mst_sub_fungsi.updated_at IS 'Tanggal dan waktu terakhir kali data diperbarui.';
COMMENT ON COLUMN public.mst_sub_fungsi.updated_by IS 'ID pengguna yang memperbarui data terakhir kali.';
COMMENT ON COLUMN public.mst_sub_fungsi.deleted_at IS 'Tanggal dan waktu data dihapus (soft delete).';
COMMENT ON COLUMN public.mst_sub_fungsi.deleted_by IS 'ID pengguna yang menghapus data.';

ALTER TABLE ONLY public.mst_sub_fungsi ADD CONSTRAINT mst_sub_fungsi_pkey PRIMARY KEY (id_sub_fungsi);
ALTER TABLE ONLY public.mst_sub_fungsi ADD CONSTRAINT mst_sub_fungsi_unique_key UNIQUE (id_sub_fungsi, tahun, id_fungsi, kode_sub_fungsi);
ALTER TABLE public.mst_sub_fungsi ADD CONSTRAINT mst_sub_fungsi_id_fungsi_foreign_key FOREIGN KEY (id_fungsi) REFERENCES public.mst_fungsi(id_fungsi) ON DELETE CASCADE ON UPDATE CASCADE;

CREATE INDEX mst_sub_fungsi_id_sub_fungsi_idx ON public.mst_sub_fungsi USING btree (id_sub_fungsi);
CREATE INDEX mst_sub_fungsi_tahun_idx ON public.mst_sub_fungsi USING btree (tahun);
CREATE INDEX mst_sub_fungsi_id_fungsi_idx ON public.mst_sub_fungsi USING btree (id_fungsi);
CREATE INDEX mst_sub_fungsi_kode_sub_fungsi_idx ON public.mst_sub_fungsi USING btree (kode_sub_fungsi);