Files
CapaKraken/packages/application/src/use-cases/allocation/update-assignment.ts
T

86 lines
3.1 KiB
TypeScript

import type { PrismaClient, Prisma } from "@planarchy/db";
import { type UpdateAssignmentInput } from "@planarchy/shared";
import { TRPCError } from "@trpc/server";
import {
ASSIGNMENT_RELATIONS_INCLUDE,
type AssignmentWithRelations,
} from "./create-assignment.js";
type DbClient = PrismaClient | Prisma.TransactionClient;
export async function updateAssignment(
db: DbClient,
id: string,
input: UpdateAssignmentInput,
): Promise<AssignmentWithRelations> {
const existing = await db.assignment.findUnique({
where: { id },
include: ASSIGNMENT_RELATIONS_INCLUDE,
});
if (!existing) {
throw new TRPCError({ code: "NOT_FOUND", message: "Assignment not found" });
}
const updatedAssignment = await db.assignment.update({
where: { id },
data: {
...(input.resourceId !== undefined ? { resourceId: input.resourceId } : {}),
...(input.projectId !== undefined ? { projectId: input.projectId } : {}),
...(input.demandRequirementId !== undefined
? { demandRequirementId: input.demandRequirementId }
: {}),
...(input.startDate !== undefined ? { startDate: input.startDate } : {}),
...(input.endDate !== undefined ? { endDate: input.endDate } : {}),
...(input.hoursPerDay !== undefined ? { hoursPerDay: input.hoursPerDay } : {}),
...(input.percentage !== undefined ? { percentage: input.percentage } : {}),
...(input.role !== undefined ? { role: input.role } : {}),
...(input.roleId !== undefined ? { roleId: input.roleId } : {}),
...(input.dailyCostCents !== undefined ? { dailyCostCents: input.dailyCostCents } : {}),
...(input.status !== undefined ? { status: input.status } : {}),
...(input.metadata !== undefined
? { metadata: input.metadata as unknown as Prisma.InputJsonValue }
: {}),
},
include: ASSIGNMENT_RELATIONS_INCLUDE,
});
await db.auditLog.create({
data: {
entityType: "Assignment",
entityId: id,
action: "UPDATE",
changes: {
before: {
resourceId: existing.resourceId,
projectId: existing.projectId,
demandRequirementId: existing.demandRequirementId,
startDate: existing.startDate,
endDate: existing.endDate,
hoursPerDay: existing.hoursPerDay,
percentage: existing.percentage,
role: existing.role,
roleId: existing.roleId,
dailyCostCents: existing.dailyCostCents,
status: existing.status,
},
after: {
resourceId: updatedAssignment.resourceId,
projectId: updatedAssignment.projectId,
demandRequirementId: updatedAssignment.demandRequirementId,
startDate: updatedAssignment.startDate,
endDate: updatedAssignment.endDate,
hoursPerDay: updatedAssignment.hoursPerDay,
percentage: updatedAssignment.percentage,
role: updatedAssignment.role,
roleId: updatedAssignment.roleId,
dailyCostCents: updatedAssignment.dailyCostCents,
status: updatedAssignment.status,
},
} as unknown as Prisma.InputJsonValue,
},
});
return updatedAssignment;
}