⚙️ Supabase Setup Required

You need to connect Hustlix Portal to your Supabase project. Follow these steps:

1

Go to supabase.com → create a new project → name it hustlix-portal

2

In your project → click SQL Editor → paste and run the SQL schema below to create all tables automatically

3

Go to Project Settings → API → copy your Project URL and anon public key → paste them below

4

Go to Authentication → Users → create your first admin user with email admin@hustlix.com and any password

📋 Click to copy SQL schema (run this in Supabase SQL Editor)
-- Run this in Supabase SQL Editor

-- Profiles table (extends auth.users)
CREATE TABLE profiles (
  id UUID REFERENCES auth.users(id) PRIMARY KEY,
  full_name TEXT NOT NULL,
  role TEXT NOT NULL CHECK (role IN ('admin', 'client', 'employee')),
  email TEXT NOT NULL,
  position TEXT,
  avatar_initials TEXT,
  is_active BOOLEAN DEFAULT true,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Client-Employee assignments
CREATE TABLE assignments (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  client_id UUID REFERENCES profiles(id) ON DELETE CASCADE,
  employee_id UUID REFERENCES profiles(id) ON DELETE CASCADE,
  assigned_at TIMESTAMPTZ DEFAULT NOW(),
  UNIQUE(client_id, employee_id)
);

-- Daily time logs
CREATE TABLE time_logs (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  employee_id UUID REFERENCES profiles(id) ON DELETE CASCADE,
  clock_in TIMESTAMPTZ,
  clock_out TIMESTAMPTZ,
  log_date DATE DEFAULT CURRENT_DATE,
  total_hours NUMERIC(4,2),
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Daily tasks
CREATE TABLE tasks (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  employee_id UUID REFERENCES profiles(id) ON DELETE CASCADE,
  title TEXT NOT NULL,
  description TEXT,
  status TEXT DEFAULT 'todo' CHECK (status IN ('todo','inprogress','done')),
  priority TEXT DEFAULT 'normal' CHECK (priority IN ('low','normal','high')),
  task_date DATE DEFAULT CURRENT_DATE,
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Row Level Security
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE assignments ENABLE ROW LEVEL SECURITY;
ALTER TABLE time_logs ENABLE ROW LEVEL SECURITY;
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;

-- Policies: admin sees everything
CREATE POLICY "Admin full access profiles" ON profiles FOR ALL USING (
  (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
);
CREATE POLICY "Admin full access assignments" ON assignments FOR ALL USING (
  (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
);
CREATE POLICY "Admin full access time_logs" ON time_logs FOR ALL USING (
  (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
);
CREATE POLICY "Admin full access tasks" ON tasks FOR ALL USING (
  (SELECT role FROM profiles WHERE id = auth.uid()) = 'admin'
);

-- Employee sees own data
CREATE POLICY "Employee own profile" ON profiles FOR SELECT USING (id = auth.uid());
CREATE POLICY "Employee own timelogs" ON time_logs FOR ALL USING (employee_id = auth.uid());
CREATE POLICY "Employee own tasks" ON tasks FOR ALL USING (employee_id = auth.uid());
CREATE POLICY "Employee own assignments" ON assignments FOR SELECT USING (employee_id = auth.uid());

-- Client sees assigned employees data
CREATE POLICY "Client assigned employees tasks" ON tasks FOR SELECT USING (
  employee_id IN (
    SELECT employee_id FROM assignments WHERE client_id = auth.uid()
  )
);
CREATE POLICY "Client assigned employees timelogs" ON time_logs FOR SELECT USING (
  employee_id IN (
    SELECT employee_id FROM assignments WHERE client_id = auth.uid()
  )
);
CREATE POLICY "Client own profile" ON profiles FOR SELECT USING (id = auth.uid());
CREATE POLICY "Client assignments" ON assignments FOR SELECT USING (client_id = auth.uid());
CREATE POLICY "Client employee profiles" ON profiles FOR SELECT USING (
  id IN (SELECT employee_id FROM assignments WHERE client_id = auth.uid())
);
?
Loading…
Loading portal…