diff --git a/prisma/migrations/20260731090347_add_asset_item/migration.sql b/prisma/migrations/20260731090347_add_asset_item/migration.sql new file mode 100644 index 0000000..d8ecc9c --- /dev/null +++ b/prisma/migrations/20260731090347_add_asset_item/migration.sql @@ -0,0 +1,18 @@ +-- CreateEnum +CREATE TYPE "AssetItemStatus" AS ENUM ('in_stock', 'assigned', 'repair', 'retired'); + +-- CreateTable +CREATE TABLE "asset_items" ( + "id" UUID NOT NULL, + "serial_number" TEXT NOT NULL, + "model" TEXT NOT NULL, + "purchase_date" DATE NOT NULL, + "warranty_end_date" DATE, + "status" "AssetItemStatus" NOT NULL DEFAULT 'in_stock', + "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "asset_items_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "asset_items_serial_number_key" ON "asset_items"("serial_number"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index eaed748..c6a5087 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -63,6 +63,35 @@ model Employee { @@map("employees") } +// Fixed, closed set of 4 values tied to the domain (see docs/ +// asset-license-management.md's "Data model (sơ bộ)" table) — native +// Postgres enum, same rationale as RequestType above. +enum AssetItemStatus { + in_stock + assigned + repair + retired +} + +// Hardware inventory — see docs/asset-license-management.md's "Data model +// (sơ bộ)" table (serial number, model, ngày mua, bảo hành, trạng thái). +// No Vendor/Assignment relation yet — those entities don't exist yet +// (see "Việc còn dở" in CLAUDE.md), so this is a standalone entity for now, +// same starting shape as Employee before Request grew an FK to it. +// warrantyEndDate is nullable: not every asset has known warranty terms at +// intake time (smallest sensible assumption — doesn't block creation). +model AssetItem { + id String @id @default(uuid()) @db.Uuid + serialNumber String @unique @map("serial_number") + model String + purchaseDate DateTime @map("purchase_date") @db.Date + warrantyEndDate DateTime? @map("warranty_end_date") @db.Date + status AssetItemStatus @default(in_stock) + createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) + + @@map("asset_items") +} + // Minimal internal auth accounts — NOT company SSO (deliberately ruled out, // see CLAUDE.md / auth decision notes). A handful of trusted IT staff // accounts, created by hand via scripts/create-user.ts, no self-registration.