Files
dyolink/backend/src/modules/treatments/lab-case-send.validation.ts

48 lines
1.5 KiB
TypeScript

import { HttpStatus } from '@nestjs/common';
import { AppException, ErrorCode } from '../../common/errors';
import { normalizeTeeth } from './treatment.utils';
export type LabCaseProsthesisLink = {
treatmentDetailId: string;
detail: { id: string; treatmentType: string; teeth: unknown };
};
export type LabCaseToothProsthesisRow = {
treatmentDetailId: string;
tooth: string;
prosthesisTypeCode: string;
};
export function assertCompleteToothProsthesisMap(labCase: {
details: LabCaseProsthesisLink[];
toothProsthesis: LabCaseToothProsthesisRow[];
}) {
const prosthesisByKey = new Set(
labCase.toothProsthesis.map((tp) => `${tp.treatmentDetailId}:${tp.tooth}`),
);
for (const link of labCase.details) {
if (link.detail.treatmentType !== 'prosthesis') {
continue;
}
const teeth = normalizeTeeth(link.detail.teeth);
for (const tooth of teeth) {
const key = `${link.treatmentDetailId}:${tooth}`;
if (!prosthesisByKey.has(key)) {
throw new AppException(ErrorCode.TREATMENT_TOOTH_PROSTHESIS_INCOMPLETE, HttpStatus.BAD_REQUEST);
}
}
if (teeth.length === 0) {
const hasArchJob = labCase.toothProsthesis.some(
(tp) =>
tp.treatmentDetailId === link.treatmentDetailId &&
(tp.tooth === 'UA' || tp.tooth === 'LA') &&
Boolean(tp.prosthesisTypeCode),
);
if (!hasArchJob) {
throw new AppException(ErrorCode.TREATMENT_TOOTH_PROSTHESIS_INCOMPLETE, HttpStatus.BAD_REQUEST);
}
}
}
}