From 2c39f0225fdc72fd539a0e7f6ff160bf25e1eb6a Mon Sep 17 00:00:00 2001 From: Hardik Date: Fri, 22 May 2026 17:14:40 +0530 Subject: [PATCH] feat(vessels): remove IMO number tracking --- App/app/(portal)/admin/sites/[id]/page.tsx | 3 +- App/app/(portal)/admin/vessels/[id]/page.tsx | 1 - App/app/(portal)/admin/vessels/actions.ts | 19 +---- App/app/(portal)/admin/vessels/page.tsx | 5 -- .../(portal)/admin/vessels/vessel-form.tsx | 7 -- .../migration.sql | 3 + App/prisma/schema.prisma | 1 - App/prisma/seed.ts | 82 ++++--------------- 8 files changed, 24 insertions(+), 97 deletions(-) create mode 100644 App/prisma/migrations/20260521000000_remove_vessel_imo_number/migration.sql diff --git a/App/app/(portal)/admin/sites/[id]/page.tsx b/App/app/(portal)/admin/sites/[id]/page.tsx index 8cd329d..059ea73 100644 --- a/App/app/(portal)/admin/sites/[id]/page.tsx +++ b/App/app/(portal)/admin/sites/[id]/page.tsx @@ -31,7 +31,7 @@ export default async function SiteDetailPage({ params }: Props) { db.site.findUnique({ where: { id }, include: { - vessels: { select: { id: true, name: true, imoNumber: true, isActive: true } }, + vessels: { select: { id: true, name: true, isActive: true } }, inventory: { include: { product: { select: { id: true, name: true, code: true } } }, orderBy: { quantity: "desc" }, @@ -176,7 +176,6 @@ export default async function SiteDetailPage({ params }: Props) { {v.name} - {v.imoNumber && IMO {v.imoNumber}} ))} diff --git a/App/app/(portal)/admin/vessels/[id]/page.tsx b/App/app/(portal)/admin/vessels/[id]/page.tsx index 8c6482a..13c3064 100644 --- a/App/app/(portal)/admin/vessels/[id]/page.tsx +++ b/App/app/(portal)/admin/vessels/[id]/page.tsx @@ -55,7 +55,6 @@ export default async function VesselDetailPage({ params }: Props) {
- {vessel.imoNumber && IMO {vessel.imoNumber}} {vessel.isActive ? "Active" : "Inactive"} diff --git a/App/app/(portal)/admin/vessels/actions.ts b/App/app/(portal)/admin/vessels/actions.ts index 32da413..50c288d 100644 --- a/App/app/(portal)/admin/vessels/actions.ts +++ b/App/app/(portal)/admin/vessels/actions.ts @@ -10,7 +10,6 @@ type ActionResult = { ok: true } | { error: string }; const vesselSchema = z.object({ name: z.string().min(1, "Vessel name is required"), - imoNumber: z.string().optional(), }); export async function createVessel(formData: FormData): Promise { @@ -21,17 +20,10 @@ export async function createVessel(formData: FormData): Promise { const parsed = vesselSchema.safeParse({ name: formData.get("name"), - imoNumber: formData.get("imoNumber") || undefined, }); if (!parsed.success) return { error: parsed.error.errors[0]?.message ?? "Validation failed" }; - const data = parsed.data; - if (data.imoNumber) { - const exists = await db.vessel.findUnique({ where: { imoNumber: data.imoNumber } }); - if (exists) return { error: "A vessel with that IMO number already exists" }; - } - - await db.vessel.create({ data: { name: data.name, imoNumber: data.imoNumber ?? null } }); + await db.vessel.create({ data: { name: parsed.data.name } }); revalidatePath("/admin/vessels"); return { ok: true }; } @@ -47,17 +39,10 @@ export async function updateVessel(formData: FormData): Promise { const parsed = vesselSchema.safeParse({ name: formData.get("name"), - imoNumber: formData.get("imoNumber") || undefined, }); if (!parsed.success) return { error: parsed.error.errors[0]?.message ?? "Validation failed" }; - const data = parsed.data; - if (data.imoNumber) { - const conflict = await db.vessel.findFirst({ where: { imoNumber: data.imoNumber, id: { not: id } } }); - if (conflict) return { error: "Another vessel already has that IMO number" }; - } - - await db.vessel.update({ where: { id }, data: { name: data.name, imoNumber: data.imoNumber ?? null } }); + await db.vessel.update({ where: { id }, data: { name: parsed.data.name } }); revalidatePath("/admin/vessels"); return { ok: true }; } diff --git a/App/app/(portal)/admin/vessels/page.tsx b/App/app/(portal)/admin/vessels/page.tsx index 6c78e35..3e46aba 100644 --- a/App/app/(portal)/admin/vessels/page.tsx +++ b/App/app/(portal)/admin/vessels/page.tsx @@ -29,7 +29,6 @@ export default async function AdminVesselsPage() { Name - IMO Number Status @@ -38,9 +37,6 @@ export default async function AdminVesselsPage() { {vessels.map((vessel) => ( {vessel.name} - - {vessel.imoNumber ?? } - diff --git a/App/app/(portal)/admin/vessels/vessel-form.tsx b/App/app/(portal)/admin/vessels/vessel-form.tsx index ee75be9..8e2f9dc 100644 --- a/App/app/(portal)/admin/vessels/vessel-form.tsx +++ b/App/app/(portal)/admin/vessels/vessel-form.tsx @@ -8,7 +8,6 @@ import { createVessel, updateVessel, toggleVesselActive } from "./actions"; type VesselRow = { id: string; name: string; - imoNumber: string | null; isActive: boolean; }; @@ -20,12 +19,6 @@ function VesselFormFields({ vessel }: { vessel?: VesselRow }) {
-
- - -
); } diff --git a/App/prisma/migrations/20260521000000_remove_vessel_imo_number/migration.sql b/App/prisma/migrations/20260521000000_remove_vessel_imo_number/migration.sql new file mode 100644 index 0000000..c46e565 --- /dev/null +++ b/App/prisma/migrations/20260521000000_remove_vessel_imo_number/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +DROP INDEX IF EXISTS "Vessel_imoNumber_key"; +ALTER TABLE "Vessel" DROP COLUMN IF EXISTS "imoNumber"; diff --git a/App/prisma/schema.prisma b/App/prisma/schema.prisma index 45082c5..310e78a 100644 --- a/App/prisma/schema.prisma +++ b/App/prisma/schema.prisma @@ -107,7 +107,6 @@ model Site { model Vessel { id String @id @default(cuid()) name String - imoNumber String? @unique isActive Boolean @default(true) siteId String? diff --git a/App/prisma/seed.ts b/App/prisma/seed.ts index fb37382..2f78055 100644 --- a/App/prisma/seed.ts +++ b/App/prisma/seed.ts @@ -157,71 +157,25 @@ async function main() { }); // ─── Vessels (Cost Centres) ────────────────────────────────────────────────── - const mvStar = await db.vessel.upsert({ - where: { imoNumber: "IMO9876543" }, - update: {}, - create: { name: "MV Pelagia Star", imoNumber: "IMO9876543", siteId: siteBOM.id }, - }); + const findOrCreateVessel = async (name: string, siteId: string) => { + const vessel = await db.vessel.findFirst({ where: { name } }); + if (vessel) { + return db.vessel.update({ where: { id: vessel.id }, data: { siteId } }); + } + return db.vessel.create({ data: { name, siteId } }); + }; - const mvWind = await db.vessel.upsert({ - where: { imoNumber: "IMO9123456" }, - update: {}, - create: { name: "MV Aegean Wind", imoNumber: "IMO9123456", siteId: siteJNP.id }, - }); - - const mvPoseidon = await db.vessel.upsert({ - where: { imoNumber: "IMO9654321" }, - update: {}, - create: { name: "MV Poseidon", imoNumber: "IMO9654321", siteId: siteKDL.id }, - }); - - const mvNereid = await db.vessel.upsert({ - where: { imoNumber: "IMO9234567" }, - update: {}, - create: { name: "MV Nereid", imoNumber: "IMO9234567", siteId: siteCHE.id }, - }); - - const mvThetis = await db.vessel.upsert({ - where: { imoNumber: "IMO9345678" }, - update: {}, - create: { name: "MV Thetis", imoNumber: "IMO9345678", siteId: siteKOC.id }, - }); - - const mvTriton = await db.vessel.upsert({ - where: { imoNumber: "IMO9456789" }, - update: {}, - create: { name: "MV Triton", imoNumber: "IMO9456789", siteId: siteVIZ.id }, - }); - - const mvAmphitrite = await db.vessel.upsert({ - where: { imoNumber: "IMO9567890" }, - update: {}, - create: { name: "MV Amphitrite", imoNumber: "IMO9567890", siteId: siteHAL.id }, - }); - - const mvProteus = await db.vessel.upsert({ - where: { imoNumber: "IMO9678901" }, - update: {}, - create: { name: "MV Proteus", imoNumber: "IMO9678901", siteId: sitePAR.id }, - }); - - const mvGalatea = await db.vessel.upsert({ - where: { imoNumber: "IMO9789012" }, - update: {}, - create: { name: "MV Galatea", imoNumber: "IMO9789012", siteId: siteMNG.id }, - }); - - const mvCallisto = await db.vessel.upsert({ - where: { imoNumber: "IMO9890123" }, - update: {}, - create: { name: "MV Callisto", imoNumber: "IMO9890123", siteId: siteGOA.id }, - }); - - await db.vessel.upsert({ - where: { imoNumber: "IMO9901234" }, - update: {}, - create: { name: "MV Doris", imoNumber: "IMO9901234", siteId: siteCHE.id }, - }); + const mvStar = await findOrCreateVessel("MV Pelagia Star", siteBOM.id); + const mvWind = await findOrCreateVessel("MV Aegean Wind", siteJNP.id); + const mvPoseidon = await findOrCreateVessel("MV Poseidon", siteKDL.id); + const mvNereid = await findOrCreateVessel("MV Nereid", siteCHE.id); + const mvThetis = await findOrCreateVessel("MV Thetis", siteKOC.id); + const mvTriton = await findOrCreateVessel("MV Triton", siteVIZ.id); + const mvAmphitrite = await findOrCreateVessel("MV Amphitrite", siteHAL.id); + const mvProteus = await findOrCreateVessel("MV Proteus", sitePAR.id); + const mvGalatea = await findOrCreateVessel("MV Galatea", siteMNG.id); + const mvCallisto = await findOrCreateVessel("MV Callisto", siteGOA.id); + await findOrCreateVessel("MV Doris", siteCHE.id); // ─── Accounts ──────────────────────────────────────────────────────────────── const accTechOps = await db.account.upsert({