MAI CALL - step 1

This commit is contained in:
2026-05-16 15:21:27 +01:00
parent c013b52f59
commit 055d6e2a24
7 changed files with 542 additions and 6 deletions
@@ -0,0 +1,46 @@
-- CreateEnum
CREATE TYPE "MaintenanceRequestStatus" AS ENUM ('OPEN', 'CLAIMED', 'RESOLVED');
-- CreateTable
CREATE TABLE "MaintenanceRequest" (
"id" TEXT NOT NULL,
"tenantId" TEXT NOT NULL,
"workstationId" TEXT NOT NULL,
"reportedByUserId" TEXT NOT NULL,
"description" TEXT NOT NULL,
"photoKey" TEXT,
"status" "MaintenanceRequestStatus" NOT NULL DEFAULT 'OPEN',
"clientRequestId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"claimedByUserId" TEXT,
"claimedAt" TIMESTAMP(3),
"resolvedByUserId" TEXT,
"resolvedAt" TIMESTAMP(3),
"resolutionNote" TEXT,
CONSTRAINT "MaintenanceRequest_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "MaintenanceRequest_tenantId_status_createdAt_idx" ON "MaintenanceRequest"("tenantId", "status", "createdAt");
-- CreateIndex
CREATE INDEX "MaintenanceRequest_tenantId_reportedByUserId_idx" ON "MaintenanceRequest"("tenantId", "reportedByUserId");
-- CreateIndex
CREATE UNIQUE INDEX "MaintenanceRequest_tenantId_clientRequestId_key" ON "MaintenanceRequest"("tenantId", "clientRequestId");
-- AddForeignKey
ALTER TABLE "MaintenanceRequest" ADD CONSTRAINT "MaintenanceRequest_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MaintenanceRequest" ADD CONSTRAINT "MaintenanceRequest_workstationId_fkey" FOREIGN KEY ("workstationId") REFERENCES "Workstation"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MaintenanceRequest" ADD CONSTRAINT "MaintenanceRequest_reportedByUserId_fkey" FOREIGN KEY ("reportedByUserId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MaintenanceRequest" ADD CONSTRAINT "MaintenanceRequest_claimedByUserId_fkey" FOREIGN KEY ("claimedByUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MaintenanceRequest" ADD CONSTRAINT "MaintenanceRequest_resolvedByUserId_fkey" FOREIGN KEY ("resolvedByUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
+45 -4
View File
@@ -19,14 +19,21 @@ enum UserRole {
OPERATOR
}
enum MaintenanceRequestStatus {
OPEN
CLAIMED
RESOLVED
}
model Tenant {
id String @id @default(cuid())
name String
createdAt DateTime @default(now())
users User[]
workstations Workstation[]
events DomainEvent[]
users User[]
workstations Workstation[]
events DomainEvent[]
maintenanceRequests MaintenanceRequest[]
}
model User {
@@ -39,6 +46,10 @@ model User {
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
reportedRequests MaintenanceRequest[] @relation("reported")
claimedRequests MaintenanceRequest[] @relation("claimed")
resolvedRequests MaintenanceRequest[] @relation("resolved")
@@unique([tenantId, email])
@@index([tenantId])
}
@@ -50,7 +61,8 @@ model Workstation {
name String
area String
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
maintenanceRequests MaintenanceRequest[]
@@unique([tenantId, code])
@@index([tenantId])
@@ -72,3 +84,32 @@ model DomainEvent {
@@index([tenantId, processedAt])
@@index([tenantId, aggregateType, aggregateId])
}
model MaintenanceRequest {
id String @id @default(cuid())
tenantId String
workstationId String
reportedByUserId String
description String
photoKey String?
status MaintenanceRequestStatus @default(OPEN)
clientRequestId String
createdAt DateTime @default(now())
claimedByUserId String?
claimedAt DateTime?
resolvedByUserId String?
resolvedAt DateTime?
resolutionNote String?
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
workstation Workstation @relation(fields: [workstationId], references: [id])
reportedBy User @relation("reported", fields: [reportedByUserId], references: [id])
claimedBy User? @relation("claimed", fields: [claimedByUserId], references: [id])
resolvedBy User? @relation("resolved", fields: [resolvedByUserId], references: [id])
@@unique([tenantId, clientRequestId])
@@index([tenantId, status, createdAt])
@@index([tenantId, reportedByUserId])
}
+1 -1
View File
@@ -84,7 +84,7 @@ import type { PrismaClient } from '@prisma/client';
* ============================================================================
*/
const TENANT_SCOPED_MODELS = ['User', 'Workstation', 'DomainEvent'] as const;
const TENANT_SCOPED_MODELS = ['User', 'Workstation', 'DomainEvent', 'MaintenanceRequest'] as const;
type TenantScopedModel = (typeof TENANT_SCOPED_MODELS)[number];
function isTenantScoped(model: string | undefined): model is TenantScopedModel {