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); } } } }