improvement: fdi tooth chart selection modes polished. bugs related to teeth selecyion fixed.

This commit is contained in:
2026-07-18 00:02:40 +03:30
parent 4b2349228a
commit 0740493384
23 changed files with 384 additions and 161 deletions

View File

@@ -33,6 +33,9 @@ const taskListInclude = {
},
} satisfies Prisma.LabCaseTaskInclude;
/** Completing this step completes every matching task in the same case (catalog: first step of all prosthesis types). */
const CASE_SCOPED_SCAN_STEP_CODE = 'intraoral_scan';
@Injectable()
export class TasksService {
constructor(
@@ -238,12 +241,13 @@ export class TasksService {
}
const updated = await this.prisma.$transaction(async (tx) => {
const now = new Date();
const result = await tx.labCaseTask.update({
where: { id: taskId },
data: {
status: dto.status,
lastStatusChangedByUserId: actorUserId,
lastStatusChangedAt: new Date(),
lastStatusChangedAt: now,
},
include: taskListInclude,
});
@@ -259,13 +263,58 @@ export class TasksService {
});
}
const cascadedScanTaskIds: string[] = [];
if (
dto.status === LabTaskStatus.COMPLETED &&
task.status !== LabTaskStatus.COMPLETED &&
task.workflowStepCode === CASE_SCOPED_SCAN_STEP_CODE
) {
const siblingScans = await tx.labCaseTask.findMany({
where: {
labCaseId: task.labCaseId,
workflowStepCode: CASE_SCOPED_SCAN_STEP_CODE,
status: { not: LabTaskStatus.COMPLETED },
id: { not: taskId },
},
select: { id: true, status: true },
});
for (const sibling of siblingScans) {
await tx.labCaseTask.update({
where: { id: sibling.id },
data: {
status: LabTaskStatus.COMPLETED,
lastStatusChangedByUserId: actorUserId,
lastStatusChangedAt: now,
},
});
await tx.labCaseTaskStatusEvent.create({
data: {
taskId: sibling.id,
fromStatus: sibling.status,
toStatus: LabTaskStatus.COMPLETED,
changedByUserId: actorUserId,
},
});
cascadedScanTaskIds.push(sibling.id);
}
}
if (dto.status === LabTaskStatus.COMPLETED && task.status !== LabTaskStatus.COMPLETED) {
await this.labCaseActivity.record(
{
labCaseId: task.labCaseId,
type: LabCaseActivityType.TASK_COMPLETED,
actorUserId,
payload: { taskId },
payload: {
taskId,
...(cascadedScanTaskIds.length > 0
? {
cascadedTaskIds: cascadedScanTaskIds,
caseScopedStep: CASE_SCOPED_SCAN_STEP_CODE,
}
: {}),
},
},
tx,
);