Files
SimpleFinanceDash/backend/migrations/001_initial.sql
2026-03-06 19:42:15 +00:00

71 lines
2.4 KiB
SQL

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TYPE category_type AS ENUM (
'bill',
'variable_expense',
'debt',
'saving',
'investment',
'income'
);
CREATE TABLE IF NOT EXISTS users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL DEFAULT '',
oidc_subject TEXT,
display_name TEXT NOT NULL DEFAULT '',
preferred_locale TEXT NOT NULL DEFAULT 'en',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_users_email ON users (email);
CREATE UNIQUE INDEX idx_users_oidc_subject ON users (oidc_subject) WHERE oidc_subject IS NOT NULL;
CREATE TABLE IF NOT EXISTS categories (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
type category_type NOT NULL,
icon TEXT NOT NULL DEFAULT '',
sort_order INT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_categories_user_id ON categories (user_id);
CREATE TABLE IF NOT EXISTS budgets (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
currency TEXT NOT NULL DEFAULT 'EUR',
carryover_amount NUMERIC(12, 2) NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_budgets_user_id ON budgets (user_id);
CREATE TABLE IF NOT EXISTS budget_items (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
budget_id UUID NOT NULL REFERENCES budgets(id) ON DELETE CASCADE,
category_id UUID NOT NULL REFERENCES categories(id) ON DELETE RESTRICT,
budgeted_amount NUMERIC(12, 2) NOT NULL DEFAULT 0,
actual_amount NUMERIC(12, 2) NOT NULL DEFAULT 0,
notes TEXT NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_budget_items_budget_id ON budget_items (budget_id);
CREATE INDEX idx_budget_items_category_id ON budget_items (category_id);
CREATE TABLE IF NOT EXISTS schema_migrations (
version INT PRIMARY KEY,
applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
);