-- CreateTable CREATE TABLE "users" ( "id" UUID NOT NULL, "first_name" VARCHAR(100) NOT NULL, "last_name" VARCHAR(100) NOT NULL, "email" VARCHAR(150) NOT NULL, "mobile" VARCHAR(15), "role" VARCHAR(30) NOT NULL DEFAULT 'User_PetOwner', "wallet_balance" DECIMAL(15,2) NOT NULL DEFAULT 0.00, "charity_donation_total" DECIMAL(15,2) NOT NULL DEFAULT 0.00, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "user_addresses" ( "id" UUID NOT NULL, "user_id" UUID NOT NULL, "title" VARCHAR(100) NOT NULL, "receptor_name" VARCHAR(150) NOT NULL, "phone" VARCHAR(15) NOT NULL, "province" VARCHAR(100) NOT NULL, "city" VARCHAR(100) NOT NULL, "detail" TEXT NOT NULL, "zip_code" VARCHAR(10) NOT NULL, "is_default" BOOLEAN NOT NULL DEFAULT false, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "user_addresses_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "wallet_transactions" ( "id" UUID NOT NULL, "user_id" UUID NOT NULL, "amount" DECIMAL(15,2) NOT NULL, "type" VARCHAR(20) NOT NULL, "status" VARCHAR(20) NOT NULL, "transaction_reference" VARCHAR(100), "description" TEXT, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "wallet_transactions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "products" ( "id" UUID NOT NULL, "art_no" VARCHAR(20) NOT NULL, "name" VARCHAR(200) NOT NULL, "scientific_tagline" VARCHAR(250), "description" TEXT NOT NULL, "short_description" TEXT, "category" VARCHAR(100) NOT NULL, "category_slug" VARCHAR(100) NOT NULL, "price_value" DECIMAL(15,2) NOT NULL, "price_display" VARCHAR(50) NOT NULL, "unit" VARCHAR(50) NOT NULL, "package_size" DECIMAL(10,2) NOT NULL, "dosage_logic" TEXT, "suitable_for" VARCHAR(15) NOT NULL, "image_url" TEXT NOT NULL, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "products_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "product_ingredients" ( "product_id" UUID NOT NULL, "ingredient" VARCHAR(150) NOT NULL, CONSTRAINT "product_ingredients_pkey" PRIMARY KEY ("product_id","ingredient") ); -- CreateTable CREATE TABLE "product_symptoms" ( "product_id" UUID NOT NULL, "symptom" VARCHAR(150) NOT NULL, CONSTRAINT "product_symptoms_pkey" PRIMARY KEY ("product_id","symptom") ); -- CreateTable CREATE TABLE "pets" ( "id" UUID NOT NULL, "user_id" UUID NOT NULL, "name" VARCHAR(100) NOT NULL, "type" VARCHAR(10) NOT NULL, "breed" VARCHAR(100) NOT NULL, "age" INTEGER NOT NULL, "weight" DECIMAL(5,2) NOT NULL, "activity_level" VARCHAR(15) NOT NULL, "image_url" TEXT, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "pets_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "pet_medical_conditions" ( "pet_id" UUID NOT NULL, "condition" VARCHAR(150) NOT NULL, CONSTRAINT "pet_medical_conditions_pkey" PRIMARY KEY ("pet_id","condition") ); -- CreateTable CREATE TABLE "reminders" ( "id" UUID NOT NULL, "pet_id" UUID NOT NULL, "product_id" UUID, "title" VARCHAR(150) NOT NULL, "time" VARCHAR(5) NOT NULL, "frequency" VARCHAR(20) NOT NULL, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "reminders_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "reminder_completions" ( "id" UUID NOT NULL, "reminder_id" UUID NOT NULL, "completed_date" DATE NOT NULL, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "reminder_completions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "health_logs" ( "id" UUID NOT NULL, "pet_id" UUID NOT NULL, "appetite" VARCHAR(15) NOT NULL, "energy" VARCHAR(15) NOT NULL, "digestion" VARCHAR(15) NOT NULL, "note" TEXT, "logged_date" DATE NOT NULL DEFAULT CURRENT_TIMESTAMP, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "health_logs_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "coupons" ( "id" UUID NOT NULL, "code" VARCHAR(50) NOT NULL, "discount_value" DECIMAL(15,2) NOT NULL, "is_active" BOOLEAN NOT NULL DEFAULT true, "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "coupons_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "orders" ( "id" UUID NOT NULL, "user_id" UUID NOT NULL, "coupon_id" UUID, "total_amount" DECIMAL(15,2) NOT NULL, "charity_donation" DECIMAL(15,2) NOT NULL DEFAULT 0.00, "status" VARCHAR(30) NOT NULL DEFAULT 'processing', "tracking_number" VARCHAR(100), "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "orders_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "order_items" ( "id" UUID NOT NULL, "order_id" UUID NOT NULL, "product_id" UUID, "quantity" INTEGER NOT NULL, "dose_qty" DECIMAL(10,2), "dose_unit" VARCHAR(50), CONSTRAINT "order_items_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE UNIQUE INDEX "users_mobile_key" ON "users"("mobile"); -- CreateIndex CREATE INDEX "user_addresses_user_id_idx" ON "user_addresses"("user_id"); -- CreateIndex CREATE UNIQUE INDEX "wallet_transactions_transaction_reference_key" ON "wallet_transactions"("transaction_reference"); -- CreateIndex CREATE UNIQUE INDEX "products_art_no_key" ON "products"("art_no"); -- CreateIndex CREATE INDEX "products_category_slug_idx" ON "products"("category_slug"); -- CreateIndex CREATE INDEX "products_suitable_for_idx" ON "products"("suitable_for"); -- CreateIndex CREATE INDEX "reminders_pet_id_idx" ON "reminders"("pet_id"); -- CreateIndex CREATE INDEX "reminder_completions_reminder_id_completed_date_idx" ON "reminder_completions"("reminder_id", "completed_date"); -- CreateIndex CREATE UNIQUE INDEX "reminder_completions_reminder_id_completed_date_key" ON "reminder_completions"("reminder_id", "completed_date"); -- CreateIndex CREATE UNIQUE INDEX "coupons_code_key" ON "coupons"("code"); -- CreateIndex CREATE UNIQUE INDEX "orders_tracking_number_key" ON "orders"("tracking_number"); -- AddForeignKey ALTER TABLE "user_addresses" ADD CONSTRAINT "user_addresses_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "wallet_transactions" ADD CONSTRAINT "wallet_transactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "product_ingredients" ADD CONSTRAINT "product_ingredients_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "product_symptoms" ADD CONSTRAINT "product_symptoms_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "pets" ADD CONSTRAINT "pets_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "pet_medical_conditions" ADD CONSTRAINT "pet_medical_conditions_pet_id_fkey" FOREIGN KEY ("pet_id") REFERENCES "pets"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reminders" ADD CONSTRAINT "reminders_pet_id_fkey" FOREIGN KEY ("pet_id") REFERENCES "pets"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reminders" ADD CONSTRAINT "reminders_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reminder_completions" ADD CONSTRAINT "reminder_completions_reminder_id_fkey" FOREIGN KEY ("reminder_id") REFERENCES "reminders"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "health_logs" ADD CONSTRAINT "health_logs_pet_id_fkey" FOREIGN KEY ("pet_id") REFERENCES "pets"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "orders" ADD CONSTRAINT "orders_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "orders" ADD CONSTRAINT "orders_coupon_id_fkey" FOREIGN KEY ("coupon_id") REFERENCES "coupons"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "order_items" ADD CONSTRAINT "order_items_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "order_items" ADD CONSTRAINT "order_items_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE SET NULL ON UPDATE CASCADE;