Files
weeding/supabase_schema.sql

123 lines
4.4 KiB
PL/PgSQL

-- Enable UUID extension
create extension if not exists "uuid-ossp";
-- Create Profiles Table (Extends Auth)
create table profiles (
id uuid references auth.users on delete cascade not null primary key,
role text check (role in ('admin', 'staff')) default 'staff',
full_name text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- Create Customers Table (CRM)
create table customers (
id uuid default uuid_generate_v4() primary key,
full_name text not null,
phone text,
email text,
city text,
district text,
address text,
notes text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- Create Halls Table (Salons)
create table halls (
id uuid default uuid_generate_v4() primary key,
name text not null,
capacity int,
description text,
features text[],
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- Create Packages Table (Pricing)
create table packages (
id uuid default uuid_generate_v4() primary key,
name text not null,
description text,
price decimal(10,2) not null,
is_active boolean default true,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- Create Reservations Table
create table reservations (
id uuid default uuid_generate_v4() primary key,
hall_id uuid references halls(id) on delete set null,
customer_id uuid references customers(id) on delete set null,
package_id uuid references packages(id) on delete set null,
start_time timestamp with time zone not null,
end_time timestamp with time zone not null,
status text check (status in ('pending', 'confirmed', 'cancelled', 'completed')) default 'pending',
notes text,
created_by uuid references auth.users(id),
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- Create Payments Table
create table payments (
id uuid default uuid_generate_v4() primary key,
reservation_id uuid references reservations(id) on delete cascade,
amount decimal(10,2) not null,
payment_type text check (payment_type in ('deposit', 'full', 'remaining')),
payment_method text check (payment_method in ('cash', 'credit_card', 'transfer')),
status text check (status in ('pending', 'paid', 'refunded')) default 'pending',
paid_at timestamp with time zone,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- RLS Policies
alter table profiles enable row level security;
alter table customers enable row level security;
alter table halls enable row level security;
alter table packages enable row level security;
alter table reservations enable row level security;
alter table payments enable row level security;
create policy "Enable all access for authenticated users" on profiles for all using (auth.role() = 'authenticated');
create policy "Enable all access for authenticated users" on customers for all using (auth.role() = 'authenticated');
create policy "Enable all access for authenticated users" on halls for all using (auth.role() = 'authenticated');
create policy "Enable all access for authenticated users" on packages for all using (auth.role() = 'authenticated');
create policy "Enable all access for authenticated users" on reservations for all using (auth.role() = 'authenticated');
create policy "Enable all access for authenticated users" on payments for all using (auth.role() = 'authenticated');
create or replace function public.handle_new_user()
returns trigger as $$
begin
insert into public.profiles (id, full_name, role)
values (new.id, new.raw_user_meta_data->>'full_name', 'staff');
return new;
end;
$$ language plpgsql security definer;
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();
-- Create Audit Logs Table
create table audit_logs (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id),
action text not null,
entity_type text not null,
entity_id uuid,
details jsonb,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- RLS for Audit Logs
alter table audit_logs enable row level security;
create policy "Admins can read all logs" on audit_logs
for select using (
exists (
select 1 from profiles
where profiles.id = auth.uid() and profiles.role = 'admin'
)
);
create policy "Users can insert logs" on audit_logs
for insert with check (auth.uid() = user_id);