backfill from projects

This commit is contained in:
2026-03-18 11:54:22 -05:00
parent c18de77640
commit f12744f05d
15 changed files with 281 additions and 9 deletions
+34 -3
View File
@@ -868,15 +868,18 @@ async function validateWorkOrderInput(payload: WorkOrderInput) {
return { ok: false as const, reason: "Build item must have at least one station operation before a work order can be created." };
}
let projectSalesOrderId: string | null = null;
if (payload.projectId) {
const project = await prisma.project.findUnique({
where: { id: payload.projectId },
select: { id: true },
select: { id: true, salesOrderId: true },
});
if (!project) {
return { ok: false as const, reason: "Linked project was not found." };
}
projectSalesOrderId = project.salesOrderId ?? null;
}
if (payload.salesOrderId) {
@@ -888,6 +891,10 @@ async function validateWorkOrderInput(payload: WorkOrderInput) {
if (!salesOrder) {
return { ok: false as const, reason: "Linked sales order was not found." };
}
if (projectSalesOrderId && projectSalesOrderId !== payload.salesOrderId) {
return { ok: false as const, reason: "Linked project does not match the selected sales order." };
}
}
if (payload.salesOrderLineId) {
@@ -928,6 +935,28 @@ async function validateWorkOrderInput(payload: WorkOrderInput) {
return { ok: true as const };
}
async function deriveProjectIdForWorkOrder(payload: WorkOrderInput) {
if (payload.projectId) {
return payload.projectId;
}
if (!payload.salesOrderId) {
return null;
}
const project = await prisma.project.findFirst({
where: {
salesOrderId: payload.salesOrderId,
},
orderBy: [{ createdAt: "asc" }],
select: {
id: true,
},
});
return project?.id ?? null;
}
export async function listManufacturingItemOptions(): Promise<ManufacturingItemOptionDto[]> {
const items = await prisma.inventoryItem.findMany({
where: {
@@ -1158,13 +1187,14 @@ export async function createWorkOrder(payload: WorkOrderInput, actorId?: string
if (!validated.ok) {
return { ok: false as const, reason: validated.reason };
}
const derivedProjectId = await deriveProjectIdForWorkOrder(payload);
const workOrderNumber = await nextWorkOrderNumber();
const created = await workOrderModel.create({
data: {
workOrderNumber,
itemId: payload.itemId,
projectId: payload.projectId,
projectId: derivedProjectId,
salesOrderId: payload.salesOrderId,
salesOrderLineId: payload.salesOrderLineId,
warehouseId: payload.warehouseId,
@@ -1223,12 +1253,13 @@ export async function updateWorkOrder(workOrderId: string, payload: WorkOrderInp
if (!validated.ok) {
return { ok: false as const, reason: validated.reason };
}
const derivedProjectId = await deriveProjectIdForWorkOrder(payload);
await workOrderModel.update({
where: { id: workOrderId },
data: {
itemId: payload.itemId,
projectId: payload.projectId,
projectId: derivedProjectId,
salesOrderId: payload.salesOrderId,
salesOrderLineId: payload.salesOrderLineId,
warehouseId: payload.warehouseId,