export interface DiagnosticReviewBasis { report: { id: string; versionId: string }; members: { id: string; versionId: string }[]; } export type DiagnosticPublicationKind = 'release' | 'addendum'; export type DiagnosticPublicationRequest = { operationId: string; basis: DiagnosticReviewBasis; text?: string; criticalFinding?: unknown; } | { operationId: string; resume: true }; export interface DiagnosticPublicationStatus { operationId: string; kind: DiagnosticPublicationKind; operationOutcome: 'pending' | 'committed' | 'not-admitted' | 'changed' | 'superseded'; clinical?: { state: string; reportId?: string; versionId?: string; at?: string; addendumCount?: number }; publication?: { state: string }; continuations?: { order?: string; return?: string; notice?: string; evidence?: string }; message?: string; reviewedReport?: { id: string; versionId: string }; claimVersionId?: string; startedAt?: string; state?: string; returned?: { outcome: string; version?: number; at?: string }; } export function diagnosticStatus(value: unknown, kind: DiagnosticPublicationKind, operationId: string): DiagnosticPublicationStatus | undefined { if (!value || typeof value !== 'object') return undefined; const status = value as DiagnosticPublicationStatus; if (status.operationOutcome === 'committed' && (status.clinical?.state !== 'committed' || !status.clinical.reportId || !status.clinical.versionId || status.publication?.state !== 'committed')) return undefined; return status.operationId === operationId && status.kind === kind && ['pending', 'committed', 'not-admitted', 'changed', 'superseded'].includes(status.operationOutcome) ? status : undefined; } export const diagnosticDebtRemains = (status: DiagnosticPublicationStatus): boolean => { if (status.operationOutcome !== 'committed' || status.clinical?.state !== 'committed') return true; const states = status.continuations; return !states || !['committed', 'superseded'].includes(states.order ?? '') || !['delivered', 'superseded', 'not-applicable'].includes(states.return ?? '') || !['handed-over', 'not-applicable'].includes(states.notice ?? '') || states.evidence !== 'handed-over'; }; const pending = new Map(); export const pendingDiagnosticOperation = (key: string) => pending.get(key); export const rememberDiagnosticOperation = (key: string, operationId: string, reviewedReport?: DiagnosticReviewBasis['report']): void => { pending.set(key, { operationId, reviewedReport }); }; export const clearDiagnosticOperation = (key: string, operationId: string): void => { if (pending.get(key)?.operationId === operationId) pending.delete(key); };