New Proje

This commit is contained in:
2026-03-17 00:46:49 +03:00
parent fc7dd7a4b2
commit ee9896315b
21 changed files with 1347 additions and 61 deletions

View File

@@ -0,0 +1,140 @@
-- 1. Create Tables
-- Companies Table
CREATE TABLE public.companies (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- Roles Table
CREATE TABLE public.roles (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
description TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- Profiles/Users Table (Extending auth.users)
CREATE TABLE public.users (
id UUID REFERENCES auth.users(id) ON DELETE CASCADE PRIMARY KEY,
first_name TEXT,
last_name TEXT,
email TEXT UNIQUE NOT NULL,
phone TEXT,
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
);
-- Employees Table
CREATE TABLE public.employees (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES public.users(id) ON DELETE CASCADE,
company_id UUID REFERENCES public.companies(id) ON DELETE CASCADE,
role_id UUID REFERENCES public.roles(id) ON DELETE RESTRICT,
department TEXT,
title TEXT,
hire_date DATE,
status TEXT DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'terminated')),
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,
UNIQUE(user_id, company_id) -- An employee can only be tied to a specific company once
);
-- Leave Requests Table
CREATE TABLE public.leave_requests (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
employee_id UUID REFERENCES public.employees(id) ON DELETE CASCADE NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected', 'cancelled')),
reason TEXT,
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. Enable Row Level Security (RLS)
ALTER TABLE public.companies ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.roles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.employees ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.leave_requests ENABLE ROW LEVEL SECURITY;
-- 3. Create Basic RLS Policies
-- Temporarily, we want authenticated users to be able to read/write.
-- In a real production setup, we'd add complex logic verifying auth.uid() against roles.
-- Companies Policies
CREATE POLICY "Allow authenticated full access to companies"
ON public.companies
FOR ALL TO authenticated
USING (true)
WITH CHECK (true);
-- Roles Policies
CREATE POLICY "Allow authenticated read access to roles"
ON public.roles
FOR SELECT TO authenticated
USING (true);
-- Users Policies
CREATE POLICY "Users can view all users"
ON public.users
FOR SELECT TO authenticated
USING (true);
CREATE POLICY "Users can insert their own profile"
ON public.users
FOR INSERT TO authenticated
WITH CHECK (auth.uid() = id);
CREATE POLICY "Users can update their own profile"
ON public.users
FOR UPDATE TO authenticated
USING (auth.uid() = id);
-- Employees Policies
CREATE POLICY "Allow authenticated full access to employees"
ON public.employees
FOR ALL TO authenticated
USING (true)
WITH CHECK (true);
-- Leave Requests Policies
CREATE POLICY "Employees can manage their own leave requests"
ON public.leave_requests
FOR ALL TO authenticated
USING (
employee_id IN (
SELECT id FROM public.employees WHERE user_id = auth.uid()
)
)
WITH CHECK (
employee_id IN (
SELECT id FROM public.employees WHERE user_id = auth.uid()
)
);
CREATE POLICY "Managers can view all leave requests"
ON public.leave_requests
FOR SELECT TO authenticated
USING (true);
-- 4. Initial Seed Data
INSERT INTO public.roles (name, description) VALUES
('admin', 'Sistem Yöneticisi (Tüm yetkiler)'),
('manager', 'Yönetici (Çalışan ve izin onay/red yetkisi)'),
('employee', 'Standart Çalışan');
-- 5. Trigger for updated_at timestamps
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER update_users_modtime BEFORE UPDATE ON public.users FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column();
CREATE TRIGGER update_employees_modtime BEFORE UPDATE ON public.employees FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column();
CREATE TRIGGER update_leave_requests_modtime BEFORE UPDATE ON public.leave_requests FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column();