-- CreateTable CREATE TABLE "regions" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "code" TEXT NOT NULL, CONSTRAINT "regions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "hotels" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "code" TEXT NOT NULL, "region_id" INTEGER NOT NULL, "status" TEXT NOT NULL DEFAULT 'ACTIVE', CONSTRAINT "hotels_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "users" ( "id" SERIAL NOT NULL, "username" TEXT NOT NULL, "email" TEXT NOT NULL, "password_hash" TEXT NOT NULL, "role" TEXT NOT NULL, "hotel_id" INTEGER NOT NULL, "area" TEXT NOT NULL, "status" TEXT NOT NULL DEFAULT 'ACTIVE', "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "compensation_plans" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "code" TEXT NOT NULL, "validity_start" TIMESTAMP(3) NOT NULL, "validity_end" TIMESTAMP(3), "type" TEXT NOT NULL, "formula" TEXT, "meta_amount" DECIMAL(12,2), "percentage_rate" DECIMAL(5,4), "max_cap" DECIMAL(12,2), "status" TEXT NOT NULL DEFAULT 'DRAFT', "version" INTEGER NOT NULL DEFAULT 1, "created_by" INTEGER NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "compensation_plans_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "calculation_rules" ( "id" SERIAL NOT NULL, "plan_id" INTEGER NOT NULL, "type" TEXT NOT NULL, "min_achievement" DECIMAL(5,4) NOT NULL, "max_achievement" DECIMAL(5,4) NOT NULL, "rate" DECIMAL(5,4) NOT NULL, "payout_amount" DECIMAL(12,2) NOT NULL, CONSTRAINT "calculation_rules_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "goals" ( "id" SERIAL NOT NULL, "target_type" TEXT NOT NULL, "target_id" INTEGER NOT NULL, "period" TEXT NOT NULL, "amount" DECIMAL(12,2) NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "goals_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "sales_results" ( "id" SERIAL NOT NULL, "source" TEXT NOT NULL, "hotel_id" INTEGER NOT NULL, "user_id" INTEGER NOT NULL, "period" TEXT NOT NULL, "amount" DECIMAL(12,2) NOT NULL, "sales_count" INTEGER NOT NULL, "status" TEXT NOT NULL DEFAULT 'PENDING', "idempotency_key" TEXT NOT NULL, "transaction_id" TEXT, "uploaded_by" INTEGER NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "sales_results_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "settlements" ( "id" SERIAL NOT NULL, "period" TEXT NOT NULL, "plan_id" INTEGER NOT NULL, "user_id" INTEGER NOT NULL, "sales_amount" DECIMAL(12,2) NOT NULL, "goal_amount" DECIMAL(12,2) NOT NULL, "achievement_percentage" DECIMAL(5,4) NOT NULL, "calculated_commission" DECIMAL(12,2) NOT NULL, "calculated_bonus" DECIMAL(12,2) NOT NULL, "adjustment_amount" DECIMAL(12,2) NOT NULL, "total_payout" DECIMAL(12,2) NOT NULL, "status" TEXT NOT NULL DEFAULT 'SIMULATED', "approved_by" INTEGER, "approved_at" TIMESTAMP(3), "rejection_reason" TEXT, "original_settlement_id" INTEGER, "adjustment_notes" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "settlements_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "audit_logs" ( "id" SERIAL NOT NULL, "user_id" INTEGER NOT NULL, "action" TEXT NOT NULL, "target_table" TEXT NOT NULL, "target_id" INTEGER NOT NULL, "previous_value" JSONB, "new_value" JSONB, "ip_address" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "notifications" ( "id" SERIAL NOT NULL, "user_id" INTEGER NOT NULL, "title" TEXT NOT NULL, "message" TEXT NOT NULL, "status" TEXT NOT NULL DEFAULT 'UNREAD', "type" TEXT NOT NULL, "sent_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "notifications_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "regions_code_key" ON "regions"("code"); -- CreateIndex CREATE UNIQUE INDEX "hotels_code_key" ON "hotels"("code"); -- CreateIndex CREATE UNIQUE INDEX "users_username_key" ON "users"("username"); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE UNIQUE INDEX "sales_results_idempotency_key_key" ON "sales_results"("idempotency_key"); -- AddForeignKey ALTER TABLE "hotels" ADD CONSTRAINT "hotels_region_id_fkey" FOREIGN KEY ("region_id") REFERENCES "regions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "users" ADD CONSTRAINT "users_hotel_id_fkey" FOREIGN KEY ("hotel_id") REFERENCES "hotels"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "compensation_plans" ADD CONSTRAINT "compensation_plans_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "calculation_rules" ADD CONSTRAINT "calculation_rules_plan_id_fkey" FOREIGN KEY ("plan_id") REFERENCES "compensation_plans"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "goals" ADD CONSTRAINT "goals_target_id_fkey" FOREIGN KEY ("target_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sales_results" ADD CONSTRAINT "sales_results_hotel_id_fkey" FOREIGN KEY ("hotel_id") REFERENCES "hotels"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sales_results" ADD CONSTRAINT "sales_results_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sales_results" ADD CONSTRAINT "sales_results_uploaded_by_fkey" FOREIGN KEY ("uploaded_by") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "settlements" ADD CONSTRAINT "settlements_plan_id_fkey" FOREIGN KEY ("plan_id") REFERENCES "compensation_plans"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "settlements" ADD CONSTRAINT "settlements_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "settlements" ADD CONSTRAINT "settlements_approved_by_fkey" FOREIGN KEY ("approved_by") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "settlements" ADD CONSTRAINT "settlements_original_settlement_id_fkey" FOREIGN KEY ("original_settlement_id") REFERENCES "settlements"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "notifications" ADD CONSTRAINT "notifications_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;