From 2762632a2513944acbe6cea5dae81360d919c7fc Mon Sep 17 00:00:00 2001 From: wasin pipattungsakul Date: Mon, 18 Dec 2023 18:27:27 +1030 Subject: [PATCH] update schema --- package.json | 3 +- .../20231206000540_initial/migration.sql | 239 --------------- .../20231218075602_initial/migration.sql | 274 ++++++++++++++++++ prisma/schema.prisma | 261 ++++++++++------- 4 files changed, 438 insertions(+), 339 deletions(-) delete mode 100644 prisma/migrations/20231206000540_initial/migration.sql create mode 100644 prisma/migrations/20231218075602_initial/migration.sql diff --git a/package.json b/package.json index 33a1a73..8773ce5 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "start": "next start", "lint": "next lint", "prepare": "husky install", - "migrate:local": "dotenv -e .env.local -- npx prisma migrate dev" + "migrate:local": "dotenv -e .env.local -- npx prisma migrate dev", + "migrate:local:flush": "rm -r prisma/migrations && dotenv -e .env.local -- npx prisma migrate dev" }, "dependencies": { "@prisma/client": "^5.6.0", diff --git a/prisma/migrations/20231206000540_initial/migration.sql b/prisma/migrations/20231206000540_initial/migration.sql deleted file mode 100644 index abeff1e..0000000 --- a/prisma/migrations/20231206000540_initial/migration.sql +++ /dev/null @@ -1,239 +0,0 @@ --- CreateEnum -CREATE TYPE "UserRoles" AS ENUM ('USER', 'RESEARCHER'); - --- CreateEnum -CREATE TYPE "EventType" AS ENUM ('RAINFALL', 'HAIL'); - --- CreateEnum -CREATE TYPE "Fertiliser" AS ENUM ('FERT1', 'FERT2'); - --- CreateEnum -CREATE TYPE "CropStage" AS ENUM ('STAGE1', 'STAGE2'); - --- CreateEnum -CREATE TYPE "Herbicide" AS ENUM ('HERB1', 'HERB2'); - --- CreateEnum -CREATE TYPE "Reason" AS ENUM ('REASON1', 'REASON2'); - --- CreateEnum -CREATE TYPE "Crop" AS ENUM ('CROP1', 'CROP2'); - --- CreateEnum -CREATE TYPE "Weeds" AS ENUM ('WEED1', 'WEED2'); - --- CreateTable -CREATE TABLE "regions" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "regions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "sites" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "regionId" INTEGER NOT NULL, - "consultantId" INTEGER NOT NULL, - - CONSTRAINT "sites_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "consultancies" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "primaryUser" TEXT NOT NULL, - "contactEmail" TEXT NOT NULL, - "contactPhone" INTEGER NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "consultancies_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "users" ( - "id" SERIAL NOT NULL, - "firstName" TEXT NOT NULL, - "lastName" TEXT NOT NULL, - "email" TEXT NOT NULL, - "role" "UserRoles" NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "consultantId" INTEGER NOT NULL, - "approved" BOOLEAN NOT NULL, - - CONSTRAINT "users_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "plots" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "siteId" INTEGER NOT NULL, - - CONSTRAINT "plots_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "subplots" ( - "id" SERIAL NOT NULL, - "label" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "plotId" INTEGER NOT NULL, - "groupId" INTEGER NOT NULL, - - CONSTRAINT "subplots_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "groups" ( - "id" SERIAL NOT NULL, - "label" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "siteId" INTEGER NOT NULL, - - CONSTRAINT "groups_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "events" ( - "id" SERIAL NOT NULL, - "description" TEXT NOT NULL, - "date" TIMESTAMP(3) NOT NULL, - "type" "EventType" NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "regionId" INTEGER NOT NULL, - "siteId" INTEGER NOT NULL, - "plotId" INTEGER NOT NULL, - "subplotId" INTEGER NOT NULL, - "data" JSONB NOT NULL, - "rainfall" DOUBLE PRECISION, - "windspeed" DOUBLE PRECISION, - "pests" BOOLEAN, - "temp_greater_than_30_degrees" BOOLEAN, - "herbicide_spray_drift" BOOLEAN, - "other_event" TEXT, - "crops_lost_percent" DOUBLE PRECISION, - "crop_damage_estimated_percent" DOUBLE PRECISION, - "comments" TEXT, - - CONSTRAINT "events_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Action" ( - "id" SERIAL NOT NULL, - "description" TEXT NOT NULL, - "date" TIMESTAMP(3) NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "groupId" INTEGER NOT NULL, - "subplotId" INTEGER NOT NULL, - "crop_stage" "CropStage" NOT NULL, - "action_reason" "Reason", - "fertiliser_name" "Fertiliser", - "fertiliser_rate" DOUBLE PRECISION, - "herbicide_name" "Herbicide", - "herbicide_rate" DOUBLE PRECISION, - "target_weeds" "Weeds"[], - "crop_planted" "Crop", - "density" DOUBLE PRECISION, - "harvest_crop" "Crop", - "yield" DOUBLE PRECISION, - "area_cut" DOUBLE PRECISION, - "biomass" DOUBLE PRECISION, - "action_comments" TEXT, - "general_comments" TEXT, - - CONSTRAINT "Action_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "sites_regionId_key" ON "sites"("regionId"); - --- CreateIndex -CREATE UNIQUE INDEX "sites_consultantId_key" ON "sites"("consultantId"); - --- CreateIndex -CREATE UNIQUE INDEX "users_consultantId_key" ON "users"("consultantId"); - --- CreateIndex -CREATE UNIQUE INDEX "plots_siteId_key" ON "plots"("siteId"); - --- CreateIndex -CREATE UNIQUE INDEX "subplots_plotId_key" ON "subplots"("plotId"); - --- CreateIndex -CREATE UNIQUE INDEX "subplots_groupId_key" ON "subplots"("groupId"); - --- CreateIndex -CREATE UNIQUE INDEX "groups_siteId_key" ON "groups"("siteId"); - --- CreateIndex -CREATE UNIQUE INDEX "events_regionId_key" ON "events"("regionId"); - --- CreateIndex -CREATE UNIQUE INDEX "events_siteId_key" ON "events"("siteId"); - --- CreateIndex -CREATE UNIQUE INDEX "events_plotId_key" ON "events"("plotId"); - --- CreateIndex -CREATE UNIQUE INDEX "events_subplotId_key" ON "events"("subplotId"); - --- CreateIndex -CREATE UNIQUE INDEX "Action_groupId_key" ON "Action"("groupId"); - --- CreateIndex -CREATE UNIQUE INDEX "Action_subplotId_key" ON "Action"("subplotId"); - --- AddForeignKey -ALTER TABLE "sites" ADD CONSTRAINT "sites_regionId_fkey" FOREIGN KEY ("regionId") REFERENCES "regions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "sites" ADD CONSTRAINT "sites_consultantId_fkey" FOREIGN KEY ("consultantId") REFERENCES "consultancies"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "users" ADD CONSTRAINT "users_consultantId_fkey" FOREIGN KEY ("consultantId") REFERENCES "consultancies"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "plots" ADD CONSTRAINT "plots_siteId_fkey" FOREIGN KEY ("siteId") REFERENCES "sites"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "subplots" ADD CONSTRAINT "subplots_plotId_fkey" FOREIGN KEY ("plotId") REFERENCES "plots"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "subplots" ADD CONSTRAINT "subplots_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "groups"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "groups" ADD CONSTRAINT "groups_siteId_fkey" FOREIGN KEY ("siteId") REFERENCES "sites"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "events" ADD CONSTRAINT "events_regionId_fkey" FOREIGN KEY ("regionId") REFERENCES "regions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "events" ADD CONSTRAINT "events_siteId_fkey" FOREIGN KEY ("siteId") REFERENCES "sites"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "events" ADD CONSTRAINT "events_plotId_fkey" FOREIGN KEY ("plotId") REFERENCES "plots"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "events" ADD CONSTRAINT "events_subplotId_fkey" FOREIGN KEY ("subplotId") REFERENCES "subplots"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Action" ADD CONSTRAINT "Action_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "groups"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Action" ADD CONSTRAINT "Action_subplotId_fkey" FOREIGN KEY ("subplotId") REFERENCES "subplots"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20231218075602_initial/migration.sql b/prisma/migrations/20231218075602_initial/migration.sql new file mode 100644 index 0000000..38f8cc8 --- /dev/null +++ b/prisma/migrations/20231218075602_initial/migration.sql @@ -0,0 +1,274 @@ +-- CreateEnum +CREATE TYPE "UserRoles" AS ENUM ('USER', 'RESEARCHER'); + +-- CreateEnum +CREATE TYPE "ProductType" AS ENUM ('HERBICIDE', 'FUNGICIDE', 'MOLLUSCICIDE', 'FERTILISER', 'INSECTICIDE'); + +-- CreateEnum +CREATE TYPE "EventType" AS ENUM ('RAINFALL', 'HAIL'); + +-- CreateEnum +CREATE TYPE "Fertiliser" AS ENUM ('FERT1', 'FERT2'); + +-- CreateEnum +CREATE TYPE "CropStage" AS ENUM ('STAGE1', 'STAGE2'); + +-- CreateEnum +CREATE TYPE "Herbicide" AS ENUM ('HERB1', 'HERB2'); + +-- CreateEnum +CREATE TYPE "Reason" AS ENUM ('REASON1', 'REASON2'); + +-- CreateEnum +CREATE TYPE "Crop" AS ENUM ('CROP1', 'CROP2'); + +-- CreateEnum +CREATE TYPE "Weeds" AS ENUM ('WEED1', 'WEED2'); + +-- CreateTable +CREATE TABLE "region" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "region_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "site" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "region_id" INTEGER NOT NULL, + "consultant_id" INTEGER NOT NULL, + + CONSTRAINT "site_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "consultant" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "primary_user" TEXT NOT NULL, + "contact_email" TEXT NOT NULL, + "contact_phone" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "consultant_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user" ( + "id" SERIAL NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "role" "UserRoles" NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "consultant_id" INTEGER NOT NULL, + "approved" BOOLEAN NOT NULL, + + CONSTRAINT "user_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "plot_group" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "site_id" INTEGER NOT NULL, + + CONSTRAINT "plot_group_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "plot" ( + "id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "plot_group_id" INTEGER NOT NULL, + "group_id" INTEGER NOT NULL +); + +-- CreateTable +CREATE TABLE "group" ( + "id" SERIAL NOT NULL, + "year" INTEGER NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "site_id" INTEGER NOT NULL, + + CONSTRAINT "group_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "event" ( + "id" SERIAL NOT NULL, + "description" TEXT NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + "type" "EventType" NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "region_id" INTEGER NOT NULL, + "site_id" INTEGER NOT NULL, + "plot_group_id" INTEGER NOT NULL, + "plot_id" TEXT NOT NULL, + "data" JSONB NOT NULL, + "rainfall" DOUBLE PRECISION, + "windspeed" DOUBLE PRECISION, + "pests" BOOLEAN, + "temp_greater_than_30_degrees" BOOLEAN, + "herbicide_spray_drift" BOOLEAN, + "other_event" TEXT, + "crops_lost_percent" DOUBLE PRECISION, + "crop_damage_estimated_percent" DOUBLE PRECISION, + "comments" TEXT, + + CONSTRAINT "event_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Action" ( + "id" SERIAL NOT NULL, + "description" TEXT NOT NULL, + "date" TIMESTAMP(3) NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "group_id" INTEGER NOT NULL, + "plot_id" TEXT NOT NULL, + "product_name" TEXT NOT NULL, + "fert_n" DOUBLE PRECISION NOT NULL, + "fert_p" DOUBLE PRECISION NOT NULL, + "fert_k" DOUBLE PRECISION NOT NULL, + "fert_s" DOUBLE PRECISION NOT NULL, + "weed_disease_active_ingred_1" TEXT NOT NULL, + "weed_disease_active_ingred_2" TEXT NOT NULL, + "weed_disease_active_ingred_3" TEXT NOT NULL, + "weed_disease_active_ingred_4" TEXT NOT NULL, + "weed_disease_active_ingred_5" TEXT NOT NULL, + "weed_disease_active_ingred_1_percent_by_weight" DOUBLE PRECISION NOT NULL, + "weed_disease_active_ingred_2_percent_by_weight" DOUBLE PRECISION NOT NULL, + "weed_disease_active_ingred_3_percent_by_weight" DOUBLE PRECISION NOT NULL, + "weed_disease_active_ingred_4_percent_by_weight" DOUBLE PRECISION NOT NULL, + "weed_disease_active_ingred_5_percent_by_weight" DOUBLE PRECISION NOT NULL, + "application_rate" DOUBLE PRECISION NOT NULL, + "application_unit" TEXT NOT NULL, + "harvest_machine" TEXT NOT NULL, + "harvest_crop_1" TEXT NOT NULL, + "harvest_crop_2" TEXT NOT NULL, + "harvest_crop_3" TEXT NOT NULL, + "harvest_crop_1_yield" DOUBLE PRECISION NOT NULL, + "harvest_crop_2_yield" DOUBLE PRECISION NOT NULL, + "harvest_crop_3_yield" DOUBLE PRECISION NOT NULL, + "sowing_crop_1" TEXT NOT NULL, + "sowing_crop_2" TEXT NOT NULL, + "sowing_crop_3" TEXT NOT NULL, + "sowing_crop_1_density" DOUBLE PRECISION NOT NULL, + "sowing_crop_2_density" DOUBLE PRECISION NOT NULL, + "sowing_crop_3_density" DOUBLE PRECISION NOT NULL, + + CONSTRAINT "Action_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "product" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "product_type" "ProductType" NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "product_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "site_region_id_idx" ON "site"("region_id"); + +-- CreateIndex +CREATE INDEX "site_consultant_id_idx" ON "site"("consultant_id"); + +-- CreateIndex +CREATE INDEX "consultant_name_idx" ON "consultant"("name"); + +-- CreateIndex +CREATE INDEX "user_consultant_id_idx" ON "user"("consultant_id"); + +-- CreateIndex +CREATE INDEX "user_first_name_idx" ON "user"("first_name"); + +-- CreateIndex +CREATE INDEX "user_role_idx" ON "user"("role"); + +-- CreateIndex +CREATE INDEX "plot_group_site_id_idx" ON "plot_group"("site_id"); + +-- CreateIndex +CREATE INDEX "plot_group_name_idx" ON "plot_group"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "plot_id_key" ON "plot"("id"); + +-- CreateIndex +CREATE INDEX "plot_plot_group_id_idx" ON "plot"("plot_group_id"); + +-- CreateIndex +CREATE INDEX "plot_group_id_idx" ON "plot"("group_id"); + +-- CreateIndex +CREATE INDEX "group_site_id_idx" ON "group"("site_id"); + +-- CreateIndex +CREATE INDEX "group_year_idx" ON "group"("year"); + +-- CreateIndex +CREATE UNIQUE INDEX "product_name_key" ON "product"("name"); + +-- CreateIndex +CREATE INDEX "product_product_type_idx" ON "product"("product_type"); + +-- AddForeignKey +ALTER TABLE "site" ADD CONSTRAINT "site_region_id_fkey" FOREIGN KEY ("region_id") REFERENCES "region"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "site" ADD CONSTRAINT "site_consultant_id_fkey" FOREIGN KEY ("consultant_id") REFERENCES "consultant"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user" ADD CONSTRAINT "user_consultant_id_fkey" FOREIGN KEY ("consultant_id") REFERENCES "consultant"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "plot_group" ADD CONSTRAINT "plot_group_site_id_fkey" FOREIGN KEY ("site_id") REFERENCES "site"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "plot" ADD CONSTRAINT "plot_plot_group_id_fkey" FOREIGN KEY ("plot_group_id") REFERENCES "plot_group"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "plot" ADD CONSTRAINT "plot_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES "group"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "group" ADD CONSTRAINT "group_site_id_fkey" FOREIGN KEY ("site_id") REFERENCES "site"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "event" ADD CONSTRAINT "event_region_id_fkey" FOREIGN KEY ("region_id") REFERENCES "region"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "event" ADD CONSTRAINT "event_site_id_fkey" FOREIGN KEY ("site_id") REFERENCES "site"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "event" ADD CONSTRAINT "event_plot_group_id_fkey" FOREIGN KEY ("plot_group_id") REFERENCES "plot_group"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "event" ADD CONSTRAINT "event_plot_id_fkey" FOREIGN KEY ("plot_id") REFERENCES "plot"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Action" ADD CONSTRAINT "Action_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES "group"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Action" ADD CONSTRAINT "Action_plot_id_fkey" FOREIGN KEY ("plot_id") REFERENCES "plot"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Action" ADD CONSTRAINT "Action_product_name_fkey" FOREIGN KEY ("product_name") REFERENCES "product"("name") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 47a37ca..c7164c6 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,65 +14,71 @@ datasource db { model Region { id Int @id @default(autoincrement()) name String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") sites Site[] events Event[] - @@map("regions") + @@map("region") } model Site { id Int @id @default(autoincrement()) name String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") - region Region? @relation(fields: [regionId], references: [id]) - regionId Int @unique - consultant Consultancy? @relation(fields: [consultantId], references: [id]) - consultantId Int @unique + region Region? @relation(fields: [regionId], references: [id]) + regionId Int @map("region_id") + consultant Consultant? @relation(fields: [consultantId], references: [id]) + consultantId Int @map("consultant_id") - plots Plot[] - groups Group[] - events Event[] + plotGroups PlotGroup[] + groups Group[] + events Event[] - @@map("sites") + @@index([regionId]) + @@index([consultantId]) + @@map("site") } // Each site has a single consultant managing that site // each consultant can manage multiple sites -model Consultancy { +model Consultant { id Int @id @default(autoincrement()) name String - primaryUser String - contactEmail String - contactPhone Int - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + primaryUser String @map("primary_user") + contactEmail String @map("contact_email") + contactPhone String @map("contact_phone") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") users User[] sites Site[] - @@map("consultancies") + @@index([name]) + @@map("consultant") } model User { id Int @id @default(autoincrement()) - firstName String - lastName String + firstName String @map("first_name") + lastName String @map("last_name") email String role UserRoles - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") - consultant Consultancy? @relation(fields: [consultantId], references: [id]) - consultantId Int @unique + consultant Consultant? @relation(fields: [consultantId], references: [id]) + consultantId Int @map("consultant_id") approved Boolean - @@map("users") + @@index([consultantId]) + @@index([firstName]) + @@index([role]) + @@map("user") } enum UserRoles { @@ -80,37 +86,40 @@ enum UserRoles { RESEARCHER } -model Plot { +model PlotGroup { id Int @id @default(autoincrement()) name String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") site Site? @relation(fields: [siteId], references: [id]) - siteId Int @unique + siteId Int @map("site_id") // system String - subplots Subplot[] - events Event[] + plots Plot[] + events Event[] - @@map("plots") + @@index([siteId]) + @@index([name]) + @@map("plot_group") } -model Subplot { - id Int @id @default(autoincrement()) - label String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt +model Plot { + id String @unique + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") - plot Plot? @relation(fields: [plotId], references: [id]) - plotId Int @unique - group Group? @relation(fields: [groupId], references: [id]) - groupId Int @unique + plotGroup PlotGroup? @relation(fields: [plotGroupId], references: [id]) + plotGroupId Int @map("plot_group_id") + group Group? @relation(fields: [groupId], references: [id]) + groupId Int @map("group_id") - events Event[] - plot_actions Action[] + events Event[] + actions Action[] - @@map("subplots") + @@index([plotGroupId]) + @@index([groupId]) + @@map("plot") } // This is just a temporary (each year) mapping of subplots to a 'group' @@ -119,17 +128,19 @@ model Subplot { // so this is just a utility to more easily enter data so that group level actions flow down to subplots. model Group { id Int @id @default(autoincrement()) - // label String // an alphanumeric label for each group - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + year Int + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") site Site? @relation(fields: [siteId], references: [id]) - siteId Int @unique + siteId Int @map("site_id") - subplots Subplot[] + subplots Plot[] group_actions Action[] - @@map("groups") + @@index([siteId]) + @@index([year]) + @@map("group") } // Event can occur at region, site, plot and subplot level @@ -138,17 +149,17 @@ model Event { description String date DateTime type EventType - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - region Region? @relation(fields: [regionId], references: [id]) - regionId Int @unique - site Site? @relation(fields: [siteId], references: [id]) - siteId Int @unique - plot Plot? @relation(fields: [plotId], references: [id]) - plotId Int @unique - subplot Subplot? @relation(fields: [subplotId], references: [id]) - subplotId Int @unique + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + region Region? @relation(fields: [regionId], references: [id]) + regionId Int @map("region_id") + site Site? @relation(fields: [siteId], references: [id]) + siteId Int @map("site_id") + plotGroup PlotGroup? @relation(fields: [plotGroupId], references: [id]) + plotGroupId Int @map("plot_group_id") + plot Plot? @relation(fields: [plotId], references: [id]) + plotId String @map("plot_id") data Json @@ -165,7 +176,7 @@ model Event { crop_damage_estimated_percent Float? comments String? - @@map("events") //map to events table + @@map("event") //map to events table } // Action model for planned trial activities (e.g. fertiliser application) @@ -175,44 +186,96 @@ model Action { id Int @id @default(autoincrement()) description String date DateTime - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - group Group? @relation(fields: [groupId], references: [id]) - groupId Int @unique - subplot Subplot? @relation(fields: [subplotId], references: [id]) - subplotId Int @unique - - // describe each action - each action has different data needs - // QUESTION - should each action have a different table with some way of linking that to this by an indicator variable like an enum? except each enum has different fields - - // crop stage at time of action - crop_stage CropStage - action_reason Reason? - - // Fertiliser application - fertiliser_name Fertiliser? - fertiliser_rate Float? - - // Herbicide application - herbicide_name Herbicide? - herbicide_rate Float? - target_weeds Weeds[] // QUESTION want to make this optional... - - // Planting/seeding - crop_planted Crop? - density Float? + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + group Group? @relation(fields: [groupId], references: [id]) + groupId Int @map("group_id") + plot Plot? @relation(fields: [plotId], references: [id]) + plotId String @map("plot_id") + product Product? @relation(fields: [productName], references: [name]) + productName String @map("product_name") + + fertN Float @map("fert_n") + fertP Float @map("fert_p") + fertK Float @map("fert_k") + fertS Float @map("fert_s") + weedDiseaseActiveIngred1 String @map("weed_disease_active_ingred_1") + weedDiseaseActiveIngred2 String @map("weed_disease_active_ingred_2") + weedDiseaseActiveIngred3 String @map("weed_disease_active_ingred_3") + weedDiseaseActiveIngred4 String @map("weed_disease_active_ingred_4") + weedDiseaseActiveIngred5 String @map("weed_disease_active_ingred_5") + weedDiseaseActiveIngred1PercentByWeight Float @map("weed_disease_active_ingred_1_percent_by_weight") + weedDiseaseActiveIngred2PercentByWeight Float @map("weed_disease_active_ingred_2_percent_by_weight") + weedDiseaseActiveIngred3PercentByWeight Float @map("weed_disease_active_ingred_3_percent_by_weight") + weedDiseaseActiveIngred4PercentByWeight Float @map("weed_disease_active_ingred_4_percent_by_weight") + weedDiseaseActiveIngred5PercentByWeight Float @map("weed_disease_active_ingred_5_percent_by_weight") + applicationRate Float @map("application_rate") + applicationUnit String @map("application_unit") + harvestMachine String @map("harvest_machine") + harvestCrop1 String @map("harvest_crop_1") + harvestCrop2 String @map("harvest_crop_2") + harvestCrop3 String @map("harvest_crop_3") + harvestCrop1Yield Float @map("harvest_crop_1_yield") + harvestCrop2Yield Float @map("harvest_crop_2_yield") + harvestCrop3Yield Float @map("harvest_crop_3_yield") + sowingCrop1 String @map("sowing_crop_1") + sowingCrop2 String @map("sowing_crop_2") + sowingCrop3 String @map("sowing_crop_3") + sowingCrop1Density Float @map("sowing_crop_1_density") + sowingCrop2Density Float @map("sowing_crop_2_density") + sowingCrop3Density Float @map("sowing_crop_3_density") + + // // describe each action - each action has different data needs + // // QUESTION - should each action have a different table with some way of linking that to this by an indicator variable like an enum? except each enum has different fields + // + // // crop stage at time of action + // crop_stage CropStage + // action_reason Reason? + // + // // Fertiliser application + // fertiliser_name Fertiliser? + // fertiliser_rate Float? + // + // // Herbicide application + // herbicide_name Herbicide? + // herbicide_rate Float? + // target_weeds Weeds[] // QUESTION want to make this optional... + // + // // Planting/seeding + // crop_planted Crop? + // density Float? + // + // // Harvest + // harvest_crop Crop? + // yield Float? + // + // // Biomass cut/assessment + // area_cut Float? + // biomass Float? + // + // action_comments String? + // general_comments String? +} - // Harvest - harvest_crop Crop? - yield Float? +model Product { + id Int @id @default(autoincrement()) + name String @unique + productType ProductType @map("product_type") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + Action Action[] - // Biomass cut/assessment - area_cut Float? - biomass Float? + @@index([productType]) + @@map("product") +} - action_comments String? - general_comments String? +enum ProductType { + HERBICIDE + FUNGICIDE + MOLLUSCICIDE + FERTILISER + INSECTICIDE } enum EventType {