/** * Dev-only: regenerate lab case tasks from existing LabCaseToothProsthesis rows. * Usage: npx ts-node prisma/regenerate-lab-tasks.ts * * The lab workflow refactor truncated lab_case_tasks. This rebuilds task sets * (grouped by treatment detail + prosthesis type, one set per workflow step) * for every already-sent case that still has prosthesis selections. */ import { PrismaClient } from '@prisma/client'; import { config } from 'dotenv'; import path from 'path'; import { generateLabCaseTasks } from '../src/modules/cases/lab-case-task.generator'; const envPath = path.join(__dirname, '..', '.env'); config({ path: envPath }); if (process.env.NODE_ENV === 'production') { console.error('regenerate-lab-tasks is not allowed in production'); process.exit(1); } const prisma = new PrismaClient(); async function main() { const cases = await prisma.labCase.findMany({ where: { sentAt: { not: null }, toothProsthesis: { some: {} }, }, select: { id: true, treatment: { select: { organization: { select: { owner: { select: { language: true } } } } } }, }, }); console.log(`Regenerating tasks for ${cases.length} sent case(s)...`); let total = 0; for (const labCase of cases) { if (!labCase.treatment) continue; const locale = labCase.treatment.organization.owner.language ?? 'en'; // Clear any stale tasks first so the generator's "already exists" guard passes. await prisma.labCaseTask.deleteMany({ where: { labCaseId: labCase.id } }); const created = await prisma.$transaction((tx) => generateLabCaseTasks(tx, labCase.id, locale), ); total += created; console.log(` - ${labCase.id}: ${created} task(s)`); } console.log(`Done. ${total} task(s) created.`); } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });