Ingests Square invoices/payments, extracts event scheduling from order notes, and pushes approved entries to a CalDAV calendar after human review. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
85 lines
2.7 KiB
SQL
85 lines
2.7 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "Role" AS ENUM ('ADMIN', 'USER');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SourceType" AS ENUM ('SQUARE_INVOICE', 'SQUARE_PAYMENT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "CandidateStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"role" "Role" NOT NULL DEFAULT 'USER',
|
|
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"createdById" TEXT,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CalendarCandidate" (
|
|
"id" TEXT NOT NULL,
|
|
"sourceType" "SourceType" NOT NULL,
|
|
"squareId" TEXT NOT NULL,
|
|
"squareEnvironment" TEXT NOT NULL,
|
|
"status" "CandidateStatus" NOT NULL DEFAULT 'PENDING',
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"startAt" TIMESTAMP(3) NOT NULL,
|
|
"endAt" TIMESTAMP(3) NOT NULL,
|
|
"allDay" BOOLEAN NOT NULL DEFAULT false,
|
|
"location" TEXT,
|
|
"customerName" TEXT,
|
|
"customerEmail" TEXT,
|
|
"amountCents" INTEGER,
|
|
"currency" TEXT DEFAULT 'USD',
|
|
"rawPayload" JSONB NOT NULL,
|
|
"fetchedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"approvedById" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"rejectedAt" TIMESTAMP(3),
|
|
"caldavEventUid" TEXT,
|
|
"caldavEventUrl" TEXT,
|
|
"caldavEtag" TEXT,
|
|
|
|
CONSTRAINT "CalendarCandidate_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SyncRun" (
|
|
"id" TEXT NOT NULL,
|
|
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"finishedAt" TIMESTAMP(3),
|
|
"trigger" TEXT NOT NULL,
|
|
"invoicesFetched" INTEGER NOT NULL DEFAULT 0,
|
|
"paymentsFetched" INTEGER NOT NULL DEFAULT 0,
|
|
"candidatesCreated" INTEGER NOT NULL DEFAULT 0,
|
|
"error" TEXT,
|
|
|
|
CONSTRAINT "SyncRun_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "CalendarCandidate_caldavEventUid_key" ON "CalendarCandidate"("caldavEventUid");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CalendarCandidate_status_idx" ON "CalendarCandidate"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "CalendarCandidate_sourceType_squareId_squareEnvironment_key" ON "CalendarCandidate"("sourceType", "squareId", "squareEnvironment");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "User" ADD CONSTRAINT "User_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CalendarCandidate" ADD CONSTRAINT "CalendarCandidate_approvedById_fkey" FOREIGN KEY ("approvedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|