- Prisma: Order, OrderItem, OrderStatusHistory + migration - Seed: 17 pedidos em 7 clientes com itens, histórico e desnorm de clientes - @sar/api-interface: contratos Zod (OrderSummary, OrderDetail, OrderListQuery, etc.) - API: GET /orders, GET /orders/:id, GET /clients/:id/orders (últimos 10) - Web: OrdersPage (lista + filtro status/número + pending_approval highlighted) - Web: ClientDetailPage (ficha completa + últimos 10 pedidos) - Web: /pedidos e /pedidos/$id adicionados ao router; ClientDetailPage substitui placeholder Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
96 lines
2.9 KiB
SQL
96 lines
2.9 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "OrderStatus" AS ENUM ('budget', 'pending_approval', 'approved', 'invoiced', 'cancelled');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Order" (
|
|
"id" UUID NOT NULL,
|
|
"number" TEXT NOT NULL,
|
|
"clientId" UUID NOT NULL,
|
|
"repId" TEXT NOT NULL,
|
|
"status" "OrderStatus" NOT NULL DEFAULT 'budget',
|
|
"discountPct" DECIMAL(5,2) NOT NULL DEFAULT 0,
|
|
"subtotal" DECIMAL(15,2) NOT NULL,
|
|
"total" DECIMAL(15,2) NOT NULL,
|
|
"notes" TEXT,
|
|
"approvedById" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"invoicedAt" TIMESTAMP(3),
|
|
"cancelledAt" TIMESTAMP(3),
|
|
"idempotencyKey" TEXT,
|
|
"issuedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"deletedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Order_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "OrderItem" (
|
|
"id" UUID NOT NULL,
|
|
"orderId" UUID NOT NULL,
|
|
"productCode" TEXT NOT NULL,
|
|
"productName" TEXT NOT NULL,
|
|
"quantity" DECIMAL(10,3) NOT NULL,
|
|
"unitPrice" DECIMAL(15,2) NOT NULL,
|
|
"discountPct" DECIMAL(5,2) NOT NULL DEFAULT 0,
|
|
"subtotal" DECIMAL(15,2) NOT NULL,
|
|
|
|
CONSTRAINT "OrderItem_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "OrderStatusHistory" (
|
|
"id" UUID NOT NULL,
|
|
"orderId" UUID NOT NULL,
|
|
"fromStatus" "OrderStatus",
|
|
"toStatus" "OrderStatus" NOT NULL,
|
|
"changedById" TEXT NOT NULL,
|
|
"note" TEXT,
|
|
"changedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "OrderStatusHistory_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Order_number_key" ON "Order"("number");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Order_idempotencyKey_key" ON "Order"("idempotencyKey");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Order_clientId_idx" ON "Order"("clientId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Order_repId_idx" ON "Order"("repId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Order_status_idx" ON "Order"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Order_issuedAt_idx" ON "Order"("issuedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Order_number_idx" ON "Order"("number");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Order_deletedAt_idx" ON "Order"("deletedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "OrderItem_orderId_idx" ON "OrderItem"("orderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "OrderStatusHistory_orderId_idx" ON "OrderStatusHistory"("orderId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "OrderStatusHistory_changedAt_idx" ON "OrderStatusHistory"("changedAt");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Order" ADD CONSTRAINT "Order_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "Client"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "OrderItem" ADD CONSTRAINT "OrderItem_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "OrderStatusHistory" ADD CONSTRAINT "OrderStatusHistory_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|