Files
neta/supabase/migrations/0004_add_business_os_tables.sql
T

95 lines
5.2 KiB
SQL

-- 0004: Faz 6 - Freelancer Business OS Tables
-- 1. Proposals
create table if not exists public.proposals (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) on delete cascade not null,
client_id uuid references public.clients(id) on delete set null,
project_id uuid references public.projects(id) on delete set null,
title text not null,
description text,
amount numeric(12,2) not null default 0,
currency text default 'TRY'::text,
status text default 'draft'::text check (status in ('draft', 'sent', 'accepted', 'rejected')),
valid_until timestamp with time zone,
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
updated_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 2. Contracts
create table if not exists public.contracts (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) on delete cascade not null,
proposal_id uuid references public.proposals(id) on delete set null,
client_id uuid references public.clients(id) on delete set null,
title text not null,
content text,
status text default 'draft'::text check (status in ('draft', 'active', 'completed', 'cancelled')),
signed_at timestamp with time zone,
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
updated_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 3. Invoices
create table if not exists public.invoices (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) on delete cascade not null,
client_id uuid references public.clients(id) on delete set null,
project_id uuid references public.projects(id) on delete set null,
invoice_number text not null,
amount numeric(12,2) not null default 0,
tax_rate numeric(5,2) default 0, -- percentage
currency text default 'TRY'::text,
status text default 'draft'::text check (status in ('draft', 'sent', 'paid', 'overdue', 'cancelled')),
issue_date timestamp with time zone default timezone('utc'::text, now()),
due_date timestamp with time zone,
paid_at timestamp with time zone,
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
updated_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 4. Subscriptions
create table if not exists public.subscriptions (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) on delete cascade not null,
name text not null,
amount numeric(12,2) not null default 0,
currency text default 'TRY'::text,
billing_cycle text default 'monthly'::text check (billing_cycle in ('monthly', 'yearly', 'weekly')),
next_billing_date timestamp with time zone,
status text default 'active'::text check (status in ('active', 'cancelled')),
category text, -- e.g., 'software', 'hosting', 'marketing'
created_at timestamp with time zone default timezone('utc'::text, now()) not null,
updated_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- Enable RLS
alter table public.proposals enable row level security;
alter table public.contracts enable row level security;
alter table public.invoices enable row level security;
alter table public.subscriptions enable row level security;
-- Proposals RLS
create policy "Users can view their own proposals" on public.proposals for select using (auth.uid() = user_id);
create policy "Users can insert their own proposals" on public.proposals for insert with check (auth.uid() = user_id);
create policy "Users can update their own proposals" on public.proposals for update using (auth.uid() = user_id);
create policy "Users can delete their own proposals" on public.proposals for delete using (auth.uid() = user_id);
-- Contracts RLS
create policy "Users can view their own contracts" on public.contracts for select using (auth.uid() = user_id);
create policy "Users can insert their own contracts" on public.contracts for insert with check (auth.uid() = user_id);
create policy "Users can update their own contracts" on public.contracts for update using (auth.uid() = user_id);
create policy "Users can delete their own contracts" on public.contracts for delete using (auth.uid() = user_id);
-- Invoices RLS
create policy "Users can view their own invoices" on public.invoices for select using (auth.uid() = user_id);
create policy "Users can insert their own invoices" on public.invoices for insert with check (auth.uid() = user_id);
create policy "Users can update their own invoices" on public.invoices for update using (auth.uid() = user_id);
create policy "Users can delete their own invoices" on public.invoices for delete using (auth.uid() = user_id);
-- Subscriptions RLS
create policy "Users can view their own subscriptions" on public.subscriptions for select using (auth.uid() = user_id);
create policy "Users can insert their own subscriptions" on public.subscriptions for insert with check (auth.uid() = user_id);
create policy "Users can update their own subscriptions" on public.subscriptions for update using (auth.uid() = user_id);
create policy "Users can delete their own subscriptions" on public.subscriptions for delete using (auth.uid() = user_id);