--
-- PostgreSQL database dump
--

\restrict zs1D2rlsJx0iqvLzWaveUNHYVe1GkLOxjdYqWvJY7HmQo9jiKKwUSsYqhTYivtX

-- Dumped from database version 17.6
-- Dumped by pg_dump version 17.9

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'SQL_ASCII';
SET standard_conforming_strings = off;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET row_security = off;

--
-- Name: public; Type: SCHEMA; Schema: -; Owner: -
--

CREATE SCHEMA public;


--
-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: -
--

COMMENT ON SCHEMA public IS 'standard public schema';


--
-- Name: app_role; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE public.app_role AS ENUM (
    'admin',
    'user'
);


--
-- Name: handle_new_user(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION public.handle_new_user() RETURNS trigger
    LANGUAGE plpgsql SECURITY DEFINER
    SET search_path TO 'public'
    AS $$
DECLARE
  jumlah_admin int;
  pilihan text;
  peran_akhir public.app_role;
BEGIN
  INSERT INTO public.profiles (id, nama, email)
  VALUES (
    NEW.id,
    COALESCE(NEW.raw_user_meta_data ->> 'nama', NEW.raw_user_meta_data ->> 'full_name', split_part(NEW.email, '@', 1)),
    NEW.email
  )
  ON CONFLICT (id) DO NOTHING;

  SELECT count(*) INTO jumlah_admin FROM public.user_roles WHERE role = 'admin';
  pilihan := lower(COALESCE(NEW.raw_user_meta_data ->> 'peran', ''));

  IF pilihan = 'admin' OR jumlah_admin = 0 THEN
    peran_akhir := 'admin'::public.app_role;
  ELSE
    peran_akhir := 'user'::public.app_role;
  END IF;

  INSERT INTO public.user_roles (user_id, role)
  VALUES (NEW.id, peran_akhir)
  ON CONFLICT DO NOTHING;

  RETURN NEW;
END;
$$;


--
-- Name: has_role(uuid, public.app_role); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION public.has_role(_user_id uuid, _role public.app_role) RETURNS boolean
    LANGUAGE sql STABLE SECURITY DEFINER
    SET search_path TO 'public'
    AS $$
  SELECT EXISTS (
    SELECT 1 FROM public.user_roles
    WHERE user_id = _user_id AND role = _role
  )
$$;


--
-- Name: update_updated_at_column(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION public.update_updated_at_column() RETURNS trigger
    LANGUAGE plpgsql
    SET search_path TO 'public'
    AS $$
BEGIN
  NEW.updated_at = now();
  RETURN NEW;
END;
$$;


SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- Name: profiles; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.profiles (
    id uuid NOT NULL,
    nama text DEFAULT ''::text NOT NULL,
    email text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);


--
-- Name: transaksi; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.transaksi (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    jenis text NOT NULL,
    nominal numeric(14,2) NOT NULL,
    tanggal date DEFAULT CURRENT_DATE NOT NULL,
    kategori text NOT NULL,
    catatan text,
    sumber text,
    tujuan text,
    bukti_path text,
    bukti_nama text,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    user_id uuid,
    kas text DEFAULT 'operasional'::text NOT NULL,
    CONSTRAINT transaksi_jenis_check CHECK ((jenis = ANY (ARRAY['pemasukan'::text, 'pengeluaran'::text]))),
    CONSTRAINT transaksi_nominal_check CHECK ((nominal >= (0)::numeric))
);


--
-- Name: user_roles; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.user_roles (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    user_id uuid NOT NULL,
    role public.app_role NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);


--
-- Data for Name: profiles; Type: TABLE DATA; Schema: public; Owner: -
--

COPY public.profiles (id, nama, email, created_at, updated_at) FROM stdin;
27f5217c-6364-4c54-8d2c-86767818b2b8	Anggi Rustam via tv9	tv94ng2024@gmail.com	2026-09-08 06:08:21.791295+00	2026-09-08 06:08:21.791295+00
eccb1915-9263-41d4-9092-6d4ed354d534	admin	admin@smnet.id	2026-09-08 06:16:23.100961+00	2026-09-08 06:16:23.100961+00
\.


--
-- Data for Name: transaksi; Type: TABLE DATA; Schema: public; Owner: -
--

COPY public.transaksi (id, jenis, nominal, tanggal, kategori, catatan, sumber, tujuan, bukti_path, bukti_nama, created_at, user_id, kas) FROM stdin;
1767c893-7db8-4d28-842d-900cc0227cef	pemasukan	156500.00	2026-08-29	Lainnya	Patty cash	Anggi rustam	Intan billing	\N	\N	2026-09-01 07:24:09.131468+00	\N	operasional
d72294e2-a513-4661-9b46-a1a616cf542f	pemasukan	300000.00	2026-08-31	Lainnya	Tambahan patty cash	Anggi rustam	Intan billing	\N	\N	2026-09-01 07:26:45.313125+00	\N	operasional
76932d74-0ee0-4c0c-90cb-9c476a6729f2	pemasukan	135000.00	2026-08-31	Lainnya	Pelanggan bayar cash	Ratna suminar	Intan billing	\N	\N	2026-09-01 07:29:04.414558+00	\N	operasional
ff076256-bd71-4ccf-8374-f80094fe258c	pengeluaran	50000.00	2026-08-29	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-01 07:33:44.382484+00	\N	operasional
b97b4c5c-aecb-43c4-9394-a833a2fe4326	pengeluaran	50000.00	2026-08-30	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-01 07:35:04.19333+00	\N	operasional
3580a04d-e564-4778-b0cf-00025c762e6d	pengeluaran	50000.00	2026-08-31	Lainnya	Fee Aktivasi	Intan billing	Team ikr	\N	\N	2026-09-01 07:40:48.606736+00	\N	operasional
932a3130-7917-43e0-8201-eafe36dee520	pengeluaran	50000.00	2026-08-31	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-01 07:41:47.559407+00	\N	operasional
dc00812e-1cda-489d-bff4-f6f84d620ca4	pengeluaran	50000.00	2026-08-31	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-01 07:42:24.97729+00	\N	operasional
dbbf9983-f542-491a-888c-c04d80c8522b	pengeluaran	25000.00	2026-08-29	Transportasi	Bensin	Intan billing	Team ikr	\N	\N	2026-09-01 07:43:49.56708+00	\N	operasional
dca7d763-a57c-4309-bd32-79b94523a43a	pengeluaran	16000.00	2026-08-31	Lainnya	Ongkir Router	Intan billing	Kurir	\N	\N	2026-09-01 07:45:41.384481+00	\N	operasional
a129fb9d-32b0-41c3-81b1-99b283893a6f	pengeluaran	50000.00	2026-09-01	Transportasi	Bensin 2 motor	Intan billing	Team ikr	\N	\N	2026-09-02 03:02:35.640593+00	\N	operasional
dcef7c49-8afa-4872-94fd-a8865fc9e205	pemasukan	75000.00	2026-09-02	Lainnya	Aktivasi cash	Cindy aulia	Intan billing	\N	\N	2026-09-02 07:25:58.361111+00	\N	operasional
867a9dd0-8d34-428b-874e-d7982b37e1e0	pengeluaran	50000.00	2026-09-02	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-02 07:26:38.573495+00	\N	operasional
880d973c-4517-46d9-8ab8-d474164d0b4b	pengeluaran	50000.00	2026-09-03	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-03 08:19:15.541927+00	\N	operasional
6283f376-07df-40ce-90a2-68445c33addd	pengeluaran	50000.00	2026-09-03	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-03 08:19:59.757733+00	\N	operasional
fd1aada3-8d19-4f86-baf1-1c42a66ecec1	pengeluaran	50000.00	2026-09-04	Lainnya	Order aktivasi	Intan billing	Sales	\N	\N	2026-09-04 03:00:04.937563+00	\N	operasional
7f954e8e-300a-439f-9626-d2bdf3ca3121	pengeluaran	50000.00	2026-09-04	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-04 09:07:57.25111+00	\N	operasional
4315ad29-1733-4bdc-8049-b694d8eb5997	pemasukan	150000.00	2026-09-05	Lainnya	Aktivasi cash	Halimah	Intan billing	\N	\N	2026-09-05 07:45:49.331819+00	\N	operasional
848f1b13-a8fa-4767-896a-1cda580fd792	pengeluaran	50000.00	2026-09-05	Lainnya	Fee aktivasi	Intan billing	Team ikr	\N	\N	2026-09-05 07:46:16.863088+00	\N	operasional
f912d70c-ef27-410c-bcc4-e9e87ac3df46	pengeluaran	20000.00	2026-09-05	Lainnya	Bayar ongkir ssd card cctv	Intan billing	Kurir	\N	\N	2026-09-08 07:38:10.328214+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
cb6cc253-551f-441f-a65c-844e15437045	pemasukan	150000.00	2026-09-07	Lainnya	Pembayaran cash	Bang colay	Intan billing	\N	\N	2026-09-08 07:41:01.786224+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
af6bc6b6-fe08-472f-9a48-430fd34d1902	pemasukan	75000.00	2026-09-07	Lainnya	Aktivasi cash	Siti masitoh	Intan billing	\N	\N	2026-09-08 07:42:47.169611+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
53e53a5c-033f-4b66-a11c-ed745c1f9842	pemasukan	100000.00	2026-09-06	Lainnya	Aktivasi cash	Erna hapipah	Intan billing	\N	\N	2026-09-08 07:44:02.008936+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
00a52692-86d8-4570-9166-d408db317aae	pemasukan	75000.00	2026-09-07	Lainnya	Aktivasi cash	Rika mustikawati	Intan billing	\N	\N	2026-09-08 07:44:40.302682+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
7ee96afe-51b8-478b-961c-332487c94ac7	pengeluaran	50000.00	2026-09-06	Lainnya	Fee aktivasi ( ipeng&jendra)	Intan billing	Team ikr	\N	\N	2026-09-08 07:47:04.527192+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
013ebcc3-98fb-417c-8da7-342245b1dfca	pengeluaran	50000.00	2026-09-07	Lainnya	Fee aktivasi ( torik-zikri )	Intan billing	Team ikr	\N	\N	2026-09-08 07:47:51.600192+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
c97d974b-7bfb-49ba-906e-5071509214c9	pengeluaran	50000.00	2026-09-07	Lainnya	Fee aktivasi ( torik-zikri )	Intan billing	Team ikr	\N	\N	2026-09-08 07:48:34.368967+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
557d531b-5c36-4689-b781-039bbf4e4d36	pengeluaran	50000.00	2026-09-07	Lainnya	Fee aktivasi ( Rifal-ipeng)	Intan billing	Team ikr	\N	\N	2026-09-08 07:49:17.517008+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
0ebe7a4b-3fb7-4796-808e-4fce3fc9a8a4	pengeluaran	50000.00	2026-09-07	Lainnya	Fee aktivasi ( rifal-ipeng )	Intan billing	Team ikr	\N	\N	2026-09-08 07:49:55.906+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
559be6c2-a68c-4e18-94a5-c51622a8901a	pengeluaran	50000.00	2026-09-07	Lainnya	Fee aktivasi ( rifal-ipeng )	Intan billing	Team ikr	\N	\N	2026-09-08 07:50:27.505385+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
ce2b0390-a19c-4cb2-b90a-605a56a16798	pengeluaran	30000.00	2026-09-07	Transportasi	Beli bensin motor server	Intan billing	Team ikr	\N	\N	2026-09-08 07:51:02.248808+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
92b0a210-b75f-40a2-b6df-44dbf4c9b2ad	pengeluaran	5000.00	2026-09-07	Lainnya	Ngeprin tugas sekolah nadya	Intan billing	Printing	\N	\N	2026-09-08 08:00:15.220328+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
6148b9ec-c9e5-4b7e-81b5-33ccaa2452d5	pengeluaran	50000.00	2026-09-08	Lainnya	Fee pemindahan perangkat ( ipeng&jendra )	Intan billing	Team ikr	\N	\N	2026-09-09 07:23:46.760128+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
f9f1470f-448c-4878-accb-56f715ca8e78	pengeluaran	50000.00	2026-09-08	Lainnya	Fee aktivasi ( torik-rifal )	Intan billing	Team ikr	\N	\N	2026-09-09 07:24:17.425403+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
4341eea9-b1c4-4bea-a7b9-aac64cc0de39	pemasukan	150000.00	2026-09-08	Lainnya	Pemindahan perangkat cash	Ibu nentih	Intan billing	\N	\N	2026-09-09 07:26:05.114483+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
a125c233-a1f0-42a4-b8f0-b5a2fbf37c5d	pengeluaran	75000.00	2026-09-09	Lainnya	Beli bensin 3 motor	Intan billing	Team ikr	\N	\N	2026-09-09 09:22:40.104928+00	eccb1915-9263-41d4-9092-6d4ed354d534	operasional
\.


--
-- Data for Name: user_roles; Type: TABLE DATA; Schema: public; Owner: -
--

COPY public.user_roles (id, user_id, role, created_at) FROM stdin;
7d495a82-d02f-4539-a60e-eca897319ff7	27f5217c-6364-4c54-8d2c-86767818b2b8	admin	2026-09-08 06:08:21.791295+00
ab839cb6-f7e3-4372-b020-74062aa5748e	eccb1915-9263-41d4-9092-6d4ed354d534	user	2026-09-08 06:16:23.100961+00
\.


--
-- Name: profiles profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.profiles
    ADD CONSTRAINT profiles_pkey PRIMARY KEY (id);


--
-- Name: transaksi transaksi_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.transaksi
    ADD CONSTRAINT transaksi_pkey PRIMARY KEY (id);


--
-- Name: user_roles user_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.user_roles
    ADD CONSTRAINT user_roles_pkey PRIMARY KEY (id);


--
-- Name: user_roles user_roles_user_id_role_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.user_roles
    ADD CONSTRAINT user_roles_user_id_role_key UNIQUE (user_id, role);


--
-- Name: idx_transaksi_kas; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_transaksi_kas ON public.transaksi USING btree (kas);


--
-- Name: profiles update_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: -
--

CREATE TRIGGER update_profiles_updated_at BEFORE UPDATE ON public.profiles FOR EACH ROW EXECUTE FUNCTION public.update_updated_at_column();


--
-- Name: profiles profiles_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.profiles
    ADD CONSTRAINT profiles_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id) ON DELETE CASCADE;


--
-- Name: transaksi transaksi_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.transaksi
    ADD CONSTRAINT transaksi_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE SET NULL;


--
-- Name: user_roles user_roles_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.user_roles
    ADD CONSTRAINT user_roles_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE;


--
-- Name: transaksi Hapus transaksi sendiri atau admin; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Hapus transaksi sendiri atau admin" ON public.transaksi FOR DELETE TO authenticated USING (((user_id = auth.uid()) OR public.has_role(auth.uid(), 'admin'::public.app_role)));


--
-- Name: transaksi Lihat kas operasional atau admin lihat semua; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Lihat kas operasional atau admin lihat semua" ON public.transaksi FOR SELECT TO authenticated USING (((kas = 'operasional'::text) OR public.has_role(auth.uid(), 'admin'::public.app_role)));


--
-- Name: user_roles Lihat peran sendiri atau admin; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Lihat peran sendiri atau admin" ON public.user_roles FOR SELECT TO authenticated USING (((user_id = auth.uid()) OR public.has_role(auth.uid(), 'admin'::public.app_role)));


--
-- Name: profiles Lihat profil sendiri atau admin; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Lihat profil sendiri atau admin" ON public.profiles FOR SELECT TO authenticated USING (((id = auth.uid()) OR public.has_role(auth.uid(), 'admin'::public.app_role)));


--
-- Name: transaksi Tambah transaksi sesuai peran; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Tambah transaksi sesuai peran" ON public.transaksi FOR INSERT TO authenticated WITH CHECK (((user_id = auth.uid()) AND ((kas = 'operasional'::text) OR public.has_role(auth.uid(), 'admin'::public.app_role))));


--
-- Name: profiles Ubah profil sendiri; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Ubah profil sendiri" ON public.profiles FOR UPDATE TO authenticated USING ((id = auth.uid())) WITH CHECK ((id = auth.uid()));


--
-- Name: transaksi Ubah transaksi sendiri atau admin; Type: POLICY; Schema: public; Owner: -
--

CREATE POLICY "Ubah transaksi sendiri atau admin" ON public.transaksi FOR UPDATE TO authenticated USING (((user_id = auth.uid()) OR public.has_role(auth.uid(), 'admin'::public.app_role))) WITH CHECK (((user_id = auth.uid()) OR public.has_role(auth.uid(), 'admin'::public.app_role)));


--
-- Name: profiles; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;

--
-- Name: transaksi; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE public.transaksi ENABLE ROW LEVEL SECURITY;

--
-- Name: user_roles; Type: ROW SECURITY; Schema: public; Owner: -
--

ALTER TABLE public.user_roles ENABLE ROW LEVEL SECURITY;

--
-- PostgreSQL database dump complete
--

\unrestrict zs1D2rlsJx0iqvLzWaveUNHYVe1GkLOxjdYqWvJY7HmQo9jiKKwUSsYqhTYivtX

