diff --git a/src/app/(app)/projects/[projectId]/deliverables/[deliverableId]/page.tsx b/src/app/(app)/projects/[projectId]/deliverables/[deliverableId]/page.tsx index 2c1d16f..612c21c 100644 --- a/src/app/(app)/projects/[projectId]/deliverables/[deliverableId]/page.tsx +++ b/src/app/(app)/projects/[projectId]/deliverables/[deliverableId]/page.tsx @@ -533,6 +533,7 @@ export default function DeliverableDetailPage() { isPending={updateDeliverable.isPending} defaultValues={{ name: deliverable.name, + omgJobNumber: deliverable.omgJobNumber ?? undefined, priority: deliverable.priority, dueDate: deliverable.dueDate ? new Date(deliverable.dueDate).toISOString().slice(0, 10) diff --git a/src/lib/services/deliverable-service.ts b/src/lib/services/deliverable-service.ts index e4e9001..a10ee4e 100644 --- a/src/lib/services/deliverable-service.ts +++ b/src/lib/services/deliverable-service.ts @@ -130,6 +130,12 @@ export async function createDeliverable( const deliverable = await tx.deliverable.create({ data: { name: data.name, + // Empty string → null so the unique constraint doesn't trip + // when two manual deliverables both leave the field blank. + omgJobNumber: + data.omgJobNumber && data.omgJobNumber.trim() !== "" + ? data.omgJobNumber.trim() + : null, priority: data.priority, notes: data.notes, projectId, @@ -351,9 +357,18 @@ export async function updateDeliverable( }; } + // Normalise omgJobNumber: empty string → null so the unique-per-org + // constraint doesn't trip when two deliverables both clear the field. + const normalised: typeof data = { ...data }; + if (Object.prototype.hasOwnProperty.call(normalised, "omgJobNumber")) { + const v = (normalised as any).omgJobNumber; + (normalised as any).omgJobNumber = + typeof v === "string" && v.trim() !== "" ? v.trim() : null; + } + const deliverable = await prisma.deliverable.update({ where: { id }, - data, + data: normalised, }); // Regenerate embedding asynchronously (non-blocking)