import {z} from 'zod' export type GetApiApi20ReportsIdArgs = {id: number}; export type GetApiApi20ReportsIdOptions = {baseUrl?: string | undefined, oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const s3RetrievingDocumentFile = z.object({base64_content: z.string().optional(), content_type: z.string().optional(), document: z.string().optional(), external_content: z.unknown(), id: z.number().int().optional(), original_filename: z.string().optional()}); export const abnormalFlagEnum = z.enum(["Abnormal", "Abnormal (applies to non-numeric results)", "Above high normal", "Alert high", "Alert low", "Below low normal", "Beta-lactamase Pos (B-lactamase antibiotic resistant).", "Better-use when direction not relevant", "Critical", "Critical abnormal", "Intermediate result", "Intermediate. Indicates for microbiology susceptibilities only.", "Moderately susceptible. Indicates for microbiology susceptibilities only.", "Negative", "Negative result", "Normal (applies to non-numeric results)", "Not Applicable", "Panic high", "Panic low", "Positive result", "Resistant. Indicates for microbiology susceptibilities only.", "Significant change down", "Significant change up", "Susceptible. Indicates for microbiology susceptibilities only.", "Very High", "Very susceptible. Indicates for microbiology susceptibilities only.", "Worse-use when direction not relevant"]); export const labResultStatus = z.enum(["AMENDED", "CORRECTED", "DELETED", "ERROR", "FINAL", "PARTIAL", "PENDING", "PRELIMINARY", "RESULT CANCELED DUE TO NON-PERFORMANCE", "RESULTS ENTERED -- NOT VERIFIED", "RESULTS STATUS CHANGE TO FINAL. RESULTS DID NOT CHANGE ( DONT TRANSMIT TEST)."]); export const labTest = z.object({code: z.string().max(50), loinc: z.string().nullable(), name: z.string().max(255)}); export const labTestCategory = z.object({description: z.string().max(200), value: z.string().max(50)}); export const valueTypeEnum = z.enum(["Coded Entry", "Encapsulated Data", "Numeric", "String Data", "Text"]); export const nullEnum = z.unknown(); export const labResult = z.object({abnormal_flag: abnormalFlagEnum, is_abnormal: z.boolean(), note: z.string().nullable(), reference_max: z.string().nullable(), reference_min: z.string().nullable(), status: labResultStatus, test: labTest, test_category: labTestCategory, text: z.string().nullable(), units: z.string().max(20).nullable().optional(), value: z.string().max(500), value_type: z.union([valueTypeEnum, nullEnum]).optional()}); export const labResultsGrid = z.object({accession_number: z.string(), collected_date: z.string(), note: z.string().nullable(), resulted_date: z.string(), results: z.array(labResult), status: labResultStatus}); export const reportImage = z.object({document: z.string(), id: z.number().int().optional()}); export const orderStatusEnum = z.enum(["CANCELED", "COMPLETED", "DISCONTINUED", "ERROR, ORDER NOT FOUND", "IN PROCESS", "ON HOLD", "REPLACED", "SCHEDULED"]); export const reportTypeEnum = z.enum(["Allergist", "Audiology", "Billing", "Business", "Cardiac", "CarePlan", "Consent", "Consultation", "Correspondence", "Cosmetic", "DME", "Dermatology", "Diabetes", "Directives", "EKG", "ENT", "Endocrinology", "Exams", "EyeVision", "Forms", "GI", "History", "Home", "Hospice", "Hospital", "Imaging", "Incoming", "Injection", "Insurance", "Intake", "Lab", "Legal", "Misc", "Neuro", "Nursing", "OBGYN", "OT", "OldRecord", "Oncology", "Ophth", "Ortho", "Outgoing", "PT", "PaperRx", "Pathology", "PatientForm", "Pediatric", "Pharmacy", "Preop", "PriorAuth", "Procedures", "Psych", "Pulmonary", "Quality", "Radiology", "SNF", "Screening", "Sleep", "Surgery", "Testing", "Therapy", "Ultrasound", "UrgentCare", "Urology", "Women"]); export const routedDocumentDelegate = z.object({created_date: z.string().nullable().optional(), deleted_date: z.string().nullable().optional(), group: z.number().int().nullable().optional(), id: z.number().int().optional(), user: z.number().int().nullable().optional()}); export const report = z.object({chart_date: z.string(), created_date: z.string().nullable().optional(), custom_title: z.string().max(255).nullable().optional(), deleted_date: z.string().nullable().optional(), document_date: z.string(), files: z.array(s3RetrievingDocumentFile).nullable().optional(), grids: z.array(labResultsGrid).optional(), id: z.number().int().optional(), images: z.array(reportImage).nullable().optional(), is_urgent: z.boolean().optional(), order_status: z.union([orderStatusEnum, nullEnum]).optional(), patient: z.number().int(), physician: z.number().int(), practice: z.number().int(), printable_view: z.string().optional(), report_type: reportTypeEnum, reported_date: z.string().optional(), requisition_number: z.string().max(100).nullable().optional(), routed_document_delegates: z.array(routedDocumentDelegate).optional(), signed_by: z.number().int().nullable().optional(), signed_date: z.string().nullable().optional(), tags: z.array(z.number().int()).optional(), vendor: z.number().int().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Retrieve Report * * GET /api/2.0/reports/{id}/ */ export const getApiApi20ReportsId = async (args: GetApiApi20ReportsIdArgs, options?: GetApiApi20ReportsIdOptions) => { const {baseUrl = "https://sandbox.elationemr.com/api/2.0", fetch: fetchFn = fetch, oauth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (oauth2 !== undefined) headers.set('authorization', `Bearer ${oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/2.0/reports/${encodeURIComponent(String(args.id))}/${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(report, await res.json()) };