feature: Phase 2- splitting the treatment schema into TreatmentDetail and LabCase.

This commit is contained in:
2026-06-28 15:34:56 +03:30
parent dc965b2528
commit 8b4ef6195d
12 changed files with 749 additions and 232 deletions

View File

@@ -0,0 +1,99 @@
-- Split treatment_cases into treatment_details + lab_cases (test data cleared).
DELETE FROM "treatment_case_sends";
DELETE FROM "treatment_case_attachments";
DELETE FROM "treatment_cases";
DELETE FROM "treatments";
DROP TABLE IF EXISTS "treatment_case_sends";
DROP TABLE IF EXISTS "treatment_case_attachments";
DROP TABLE IF EXISTS "treatment_cases";
CREATE TABLE "treatment_details" (
"id" TEXT NOT NULL,
"treatmentId" TEXT NOT NULL,
"clientKey" TEXT,
"sortOrder" INTEGER NOT NULL,
"treatmentType" TEXT NOT NULL,
"teeth" JSONB NOT NULL,
"comment" TEXT,
CONSTRAINT "treatment_details_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "treatment_detail_attachments" (
"id" TEXT NOT NULL,
"detailId" TEXT,
"appointmentId" TEXT,
"detailClientKey" TEXT,
"fileName" TEXT NOT NULL,
"mimeType" TEXT NOT NULL,
"sizeBytes" INTEGER NOT NULL,
"storagePath" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "treatment_detail_attachments_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "lab_cases" (
"id" TEXT NOT NULL,
"treatmentId" TEXT NOT NULL,
"clientKey" TEXT,
"sortOrder" INTEGER NOT NULL,
"destinationOrganizationId" TEXT,
"labComment" TEXT,
"sentAt" TIMESTAMP(3),
CONSTRAINT "lab_cases_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "lab_case_details" (
"labCaseId" TEXT NOT NULL,
"treatmentDetailId" TEXT NOT NULL,
CONSTRAINT "lab_case_details_pkey" PRIMARY KEY ("labCaseId", "treatmentDetailId")
);
CREATE TABLE "lab_case_sends" (
"id" TEXT NOT NULL,
"labCaseId" TEXT NOT NULL,
"organizationId" TEXT NOT NULL,
"sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "lab_case_sends_pkey" PRIMARY KEY ("id")
);
CREATE INDEX "treatment_details_treatmentId_sortOrder_idx" ON "treatment_details"("treatmentId", "sortOrder");
CREATE INDEX "treatment_detail_attachments_appointmentId_detailClientKey_idx" ON "treatment_detail_attachments"("appointmentId", "detailClientKey");
CREATE INDEX "treatment_detail_attachments_detailId_idx" ON "treatment_detail_attachments"("detailId");
CREATE INDEX "lab_cases_treatmentId_sortOrder_idx" ON "lab_cases"("treatmentId", "sortOrder");
CREATE UNIQUE INDEX "lab_case_details_treatmentDetailId_key" ON "lab_case_details"("treatmentDetailId");
CREATE UNIQUE INDEX "lab_case_sends_labCaseId_organizationId_key" ON "lab_case_sends"("labCaseId", "organizationId");
ALTER TABLE "treatment_details"
ADD CONSTRAINT "treatment_details_treatmentId_fkey"
FOREIGN KEY ("treatmentId") REFERENCES "treatments"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "treatment_detail_attachments"
ADD CONSTRAINT "treatment_detail_attachments_detailId_fkey"
FOREIGN KEY ("detailId") REFERENCES "treatment_details"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "lab_cases"
ADD CONSTRAINT "lab_cases_treatmentId_fkey"
FOREIGN KEY ("treatmentId") REFERENCES "treatments"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "lab_case_details"
ADD CONSTRAINT "lab_case_details_labCaseId_fkey"
FOREIGN KEY ("labCaseId") REFERENCES "lab_cases"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "lab_case_details"
ADD CONSTRAINT "lab_case_details_treatmentDetailId_fkey"
FOREIGN KEY ("treatmentDetailId") REFERENCES "treatment_details"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "lab_case_sends"
ADD CONSTRAINT "lab_case_sends_labCaseId_fkey"
FOREIGN KEY ("labCaseId") REFERENCES "lab_cases"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "lab_case_sends"
ADD CONSTRAINT "lab_case_sends_organizationId_fkey"
FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -63,7 +63,7 @@ model Organization {
createdPatients Patient[] @relation("PatientCreatedBy")
appointments Appointment[]
treatments Treatment[]
caseSends TreatmentCaseSend[]
labCaseSends LabCaseSend[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -131,7 +131,8 @@ model Treatment {
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade)
appointment Appointment? @relation(fields: [appointmentId], references: [id], onDelete: SetNull)
cases TreatmentCase[]
details TreatmentDetail[]
labCases LabCase[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -141,54 +142,81 @@ model Treatment {
@@map("treatments")
}
model TreatmentCase {
id String @id @default(uuid())
model TreatmentDetail {
id String @id @default(uuid())
treatmentId String
clientKey String?
sortOrder Int
treatmentType String
teeth Json
comment String?
sentAt DateTime?
treatment Treatment @relation(fields: [treatmentId], references: [id], onDelete: Cascade)
attachments TreatmentCaseAttachment[]
sends TreatmentCaseSend[]
treatment Treatment @relation(fields: [treatmentId], references: [id], onDelete: Cascade)
attachments TreatmentDetailAttachment[]
labCaseLink LabCaseDetail?
@@index([treatmentId, sortOrder])
@@map("treatment_cases")
@@map("treatment_details")
}
model TreatmentCaseAttachment {
id String @id @default(uuid())
caseId String?
appointmentId String?
caseClientKey String?
fileName String
mimeType String
sizeBytes Int
storagePath String
model TreatmentDetailAttachment {
id String @id @default(uuid())
detailId String?
appointmentId String?
detailClientKey String?
fileName String
mimeType String
sizeBytes Int
storagePath String
case TreatmentCase? @relation(fields: [caseId], references: [id], onDelete: Cascade)
detail TreatmentDetail? @relation(fields: [detailId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
@@index([appointmentId, caseClientKey])
@@index([caseId])
@@map("treatment_case_attachments")
@@index([appointmentId, detailClientKey])
@@index([detailId])
@@map("treatment_detail_attachments")
}
model TreatmentCaseSend {
model LabCase {
id String @id @default(uuid())
treatmentId String
clientKey String?
sortOrder Int
destinationOrganizationId String?
labComment String?
sentAt DateTime?
treatment Treatment @relation(fields: [treatmentId], references: [id], onDelete: Cascade)
details LabCaseDetail[]
sends LabCaseSend[]
@@index([treatmentId, sortOrder])
@@map("lab_cases")
}
model LabCaseDetail {
labCaseId String
treatmentDetailId String @unique
labCase LabCase @relation(fields: [labCaseId], references: [id], onDelete: Cascade)
detail TreatmentDetail @relation(fields: [treatmentDetailId], references: [id], onDelete: Cascade)
@@id([labCaseId, treatmentDetailId])
@@map("lab_case_details")
}
model LabCaseSend {
id String @id @default(uuid())
caseId String
labCaseId String
organizationId String
sentAt DateTime @default(now())
case TreatmentCase @relation(fields: [caseId], references: [id], onDelete: Cascade)
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
labCase LabCase @relation(fields: [labCaseId], references: [id], onDelete: Cascade)
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
@@unique([caseId, organizationId])
@@map("treatment_case_sends")
@@unique([labCaseId, organizationId])
@@map("lab_case_sends")
}
model Plan {