-- CreateEnum CREATE TYPE "roles" AS ENUM ('ADMIN', 'SUPERVISOR', 'HR', 'ACCOUNTING', 'EMPLOYEE', 'DEALER', 'CUSTOMER', 'GUEST'); -- CreateEnum CREATE TYPE "leave_types" AS ENUM ('SICK', 'VACATION', 'UNPAID', 'BEREAVEMENT', 'PARENTAL', 'LEGAL'); -- CreateEnum CREATE TYPE "leave_approval_status" AS ENUM ('PENDING', 'APPROVED', 'DENIED', 'CANCELLED', 'ESCALATED'); -- CreateTable CREATE TABLE "users" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "first_name" TEXT NOT NULL, "last_name" TEXT NOT NULL, "email" TEXT NOT NULL, "phone_number" INTEGER NOT NULL, "residence" TEXT, "role" "roles" NOT NULL DEFAULT 'GUEST', CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "employees" ( "id" SERIAL NOT NULL, "user_id" UUID NOT NULL, "external_payroll_id" INTEGER NOT NULL, "company_code" INTEGER NOT NULL, "first_work_day" TIMESTAMP(3) NOT NULL, "last_work_day" TIMESTAMP(3), CONSTRAINT "employees_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "customers" ( "id" SERIAL NOT NULL, "user_id" UUID NOT NULL, "invoice_id" INTEGER, CONSTRAINT "customers_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "leave_requests" ( "id" SERIAL NOT NULL, "employee_id" INTEGER NOT NULL, "leave_type" "leave_types" NOT NULL, "start_date_time" TIMESTAMP(3) NOT NULL, "end_date_time" TIMESTAMP(3), "comment" TEXT NOT NULL, "approval_status" "leave_approval_status" NOT NULL DEFAULT 'PENDING', CONSTRAINT "leave_requests_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "timesheets" ( "id" SERIAL NOT NULL, "employee_id" INTEGER NOT NULL, "is_approved" BOOLEAN NOT NULL DEFAULT false, CONSTRAINT "timesheets_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "shifts" ( "id" SERIAL NOT NULL, "timesheet_id" INTEGER NOT NULL, "shift_code_id" INTEGER NOT NULL, "date" TIMESTAMP(3) NOT NULL, "start_time" TIMESTAMP(3) NOT NULL, "end_time" TIMESTAMP(3) NOT NULL, CONSTRAINT "shifts_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "shift_codes" ( "id" SERIAL NOT NULL, "shift_type" TEXT NOT NULL, "bank_code" TEXT NOT NULL, CONSTRAINT "shift_codes_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "refresh_tokens" ( "id" TEXT NOT NULL, "user_id" UUID NOT NULL, "application" TEXT NOT NULL, "access_token" TEXT NOT NULL, "refresh_token" TEXT NOT NULL, "access_token_expiry" TIMESTAMP(3) NOT NULL, "refresh_token_expiry" TIMESTAMP(3), "is_revoked" BOOLEAN NOT NULL DEFAULT false, "scopes" JSONB NOT NULL DEFAULT '[]', "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), CONSTRAINT "refresh_tokens_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE UNIQUE INDEX "users_phone_number_key" ON "users"("phone_number"); -- CreateIndex CREATE UNIQUE INDEX "employees_user_id_key" ON "employees"("user_id"); -- CreateIndex CREATE UNIQUE INDEX "customers_user_id_key" ON "customers"("user_id"); -- CreateIndex CREATE UNIQUE INDEX "customers_invoice_id_key" ON "customers"("invoice_id"); -- CreateIndex CREATE UNIQUE INDEX "refresh_tokens_access_token_key" ON "refresh_tokens"("access_token"); -- CreateIndex CREATE UNIQUE INDEX "refresh_tokens_refresh_token_key" ON "refresh_tokens"("refresh_token"); -- AddForeignKey ALTER TABLE "employees" ADD CONSTRAINT "employees_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "customers" ADD CONSTRAINT "customers_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "leave_requests" ADD CONSTRAINT "leave_requests_employee_id_fkey" FOREIGN KEY ("employee_id") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "timesheets" ADD CONSTRAINT "timesheets_employee_id_fkey" FOREIGN KEY ("employee_id") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "shifts" ADD CONSTRAINT "shifts_timesheet_id_fkey" FOREIGN KEY ("timesheet_id") REFERENCES "timesheets"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "shifts" ADD CONSTRAINT "shifts_shift_code_id_fkey" FOREIGN KEY ("shift_code_id") REFERENCES "shift_codes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "refresh_tokens" ADD CONSTRAINT "refresh_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;