99 lines
3.9 KiB
SQL
99 lines
3.9 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "ReservationStatus" AS ENUM ('ACTIVE', 'RELEASED', 'COMMITTED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "warehouses" (
|
|
"id" UUID NOT NULL,
|
|
"organization_id" UUID NOT NULL,
|
|
"name" VARCHAR(100) NOT NULL,
|
|
|
|
CONSTRAINT "warehouses_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "stock_items" (
|
|
"id" UUID NOT NULL,
|
|
"organization_id" UUID NOT NULL,
|
|
"variant_id" UUID NOT NULL,
|
|
"warehouse_id" UUID NOT NULL,
|
|
"on_hand" INTEGER NOT NULL DEFAULT 0,
|
|
|
|
CONSTRAINT "stock_items_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "stock_ledger" (
|
|
"id" UUID NOT NULL,
|
|
"stock_item_id" UUID NOT NULL,
|
|
"organization_id" UUID NOT NULL,
|
|
"actor_id" UUID NOT NULL,
|
|
"delta" INTEGER NOT NULL,
|
|
"reason" VARCHAR(200) NOT NULL,
|
|
"idempotency_key" UUID NOT NULL,
|
|
"request_hash" CHAR(64) NOT NULL,
|
|
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "stock_ledger_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "stock_reservations" (
|
|
"id" UUID NOT NULL,
|
|
"stock_item_id" UUID NOT NULL,
|
|
"organization_id" UUID NOT NULL,
|
|
"user_id" UUID NOT NULL,
|
|
"quantity" INTEGER NOT NULL,
|
|
"status" "ReservationStatus" NOT NULL DEFAULT 'ACTIVE',
|
|
"idempotency_key" UUID NOT NULL,
|
|
"request_hash" CHAR(64) NOT NULL,
|
|
"expires_at" TIMESTAMPTZ(3) NOT NULL,
|
|
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "stock_reservations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "warehouses_organization_id_name_key" ON "warehouses"("organization_id", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "warehouses_id_organization_id_key" ON "warehouses"("id", "organization_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "stock_items_organization_id_id_idx" ON "stock_items"("organization_id", "id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "stock_items_variant_id_warehouse_id_key" ON "stock_items"("variant_id", "warehouse_id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "stock_items_id_organization_id_key" ON "stock_items"("id", "organization_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "stock_ledger_stock_item_id_created_at_id_idx" ON "stock_ledger"("stock_item_id", "created_at", "id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "stock_ledger_organization_id_idempotency_key_key" ON "stock_ledger"("organization_id", "idempotency_key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "stock_reservations_stock_item_id_status_expires_at_idx" ON "stock_reservations"("stock_item_id", "status", "expires_at");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "stock_reservations_user_id_organization_id_idx" ON "stock_reservations"("user_id", "organization_id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "stock_reservations_organization_id_idempotency_key_key" ON "stock_reservations"("organization_id", "idempotency_key");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "warehouses" ADD CONSTRAINT "warehouses_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_variant_id_organization_id_fkey" FOREIGN KEY ("variant_id", "organization_id") REFERENCES "product_variants"("id", "organization_id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "stock_items" ADD CONSTRAINT "stock_items_warehouse_id_organization_id_fkey" FOREIGN KEY ("warehouse_id", "organization_id") REFERENCES "warehouses"("id", "organization_id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "stock_ledger" ADD CONSTRAINT "stock_ledger_stock_item_id_organization_id_fkey" FOREIGN KEY ("stock_item_id", "organization_id") REFERENCES "stock_items"("id", "organization_id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "stock_reservations" ADD CONSTRAINT "stock_reservations_stock_item_id_organization_id_fkey" FOREIGN KEY ("stock_item_id", "organization_id") REFERENCES "stock_items"("id", "organization_id") ON DELETE RESTRICT ON UPDATE CASCADE;
|