import {z} from 'zod' export type GetApiApi20PatientsArgs = {dob?: string | undefined, first_name?: string | undefined, group_id?: string | undefined, insurance_company?: number | undefined, insurance_plan?: number | undefined, last_modified__gt?: string | undefined, last_modified__gte?: string | undefined, last_modified__lt?: string | undefined, last_modified__lte?: string | undefined, last_name?: string | undefined, limit?: number | undefined, master?: number | undefined, master_patient?: number | undefined, member_id?: string | undefined, offset?: number | undefined, order_by?: string | undefined, phone_number?: string | undefined, practice?: Array | undefined, sex?: string | undefined}; export type GetApiApi20PatientsOptions = {baseUrl?: string | undefined, oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const address = z.object({address_line1: z.string().max(200).optional(), address_line2: z.string().max(35).nullable().optional(), city: z.string().max(50).optional(), state: z.string().max(2).optional(), zip: z.string().max(10).optional()}); export const consent = z.object({application: z.string().optional(), consented: z.boolean().optional(), is_active: z.boolean().optional(), last_modified_date: z.string().optional()}); export const paymentProgramEnum = z.enum(["Commercial - HMSA", "Commercial - Other", "Commercial - SFHP", "Medicaid", "Medicare Advantage", "Medicare Part B", "Worker's Compensation"]); export const rankEnum = z.enum(["primary", "secondary", "tertiary"]); export const insurerRelationshipType = z.enum(["Child", "Other", "Spouse"]); export const nullEnum = z.unknown(); export const insurance = z.object({address: z.string().max(200).nullable().optional(), carrier: z.string().max(200).nullable().optional(), city: z.string().max(50).nullable().optional(), copay: z.string().nullable().optional(), created_date: z.string().nullable().optional(), deductible: z.string().nullable().optional(), deleted_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), extension: z.string().max(6).nullable().optional(), group_id: z.string().max(50).nullable().optional(), id: z.number().int().nullable().optional(), insurance_company: z.number().int().nullable().optional(), insurance_plan: z.number().int().nullable().optional(), insured_person_address: z.string().max(200).nullable().optional(), insured_person_city: z.string().max(50).nullable().optional(), insured_person_dob: z.string().max(50).nullable().optional(), insured_person_first_name: z.string().max(200).nullable().optional(), insured_person_gender: z.string().max(1).nullable().optional(), insured_person_id: z.string().max(50).nullable().optional(), insured_person_last_name: z.string().max(200).nullable().optional(), insured_person_ssn: z.string().max(11).nullable().optional(), insured_person_state: z.string().max(2).nullable().optional(), insured_person_zip: z.string().max(10).nullable().optional(), member_id: z.string().max(50).nullable().optional(), payment_program: paymentProgramEnum.optional(), phone: z.string().max(20).nullable().optional(), plan: z.string().max(200).nullable().optional(), rank: rankEnum, relationship_to_insured: z.union([insurerRelationshipType, nullEnum]).optional(), start_date: z.string().nullable().optional(), state: z.string().max(2).nullable().optional(), suite: z.string().max(35).nullable().optional(), zip: z.string().max(10).nullable().optional()}); export const email = z.object({created_date: z.string().nullable().optional(), deleted_date: z.string().nullable().optional(), email: z.string().max(254).nullable().optional()}); export const emergencyContact = z.object({address_line1: z.string().max(200).nullable().optional(), address_line2: z.string().max(35).nullable().optional(), city: z.string().max(50).nullable().optional(), first_name: z.string().max(70).nullable().optional(), id: z.number().int().optional(), last_name: z.string().max(70).nullable().optional(), phone: z.string().max(20).nullable().optional(), relationship: z.string().max(30).nullable().optional(), state: z.string().max(2).nullable().optional(), zip: z.string().max(10).nullable().optional()}); export const employer = z.object({code: z.string().max(50), description: z.string().nullable().optional(), name: z.string().nullable().optional()}); export const ethnicityEnum = z.enum(["Declined to specify", "Hispanic or Latino", "No ethnicity specified", "Not Hispanic or Latino"]); export const genderIdentityEnum = z.enum(["man", "nonbinary", "option_not_listed", "prefer_not_to_say", "transgender_man", "transgender_woman", "two_spirit", "unknown", "woman"]); export const guarantor = z.object({address: z.string().max(200).optional(), city: z.string().max(50).optional(), email: z.string().max(254).nullable().optional(), first_name: z.string().max(105).nullable().optional(), id: z.number().int().optional(), last_name: z.string().max(105).nullable().optional(), phone: z.string().max(20).nullable().optional(), relationship: z.union([insurerRelationshipType, nullEnum]).optional(), state: z.string().max(2).optional(), zip: z.string().max(10).optional()}); export const legalGenderMarkerEnum = z.enum(["F", "M", "U", "X", "None"]); export const legalGenderMarkerDisplayEnum = z.enum(["F", "M", "None Selected", "X", "None"]); export const status = z.enum(["active", "inactive"]); export const phoneTypeEnum = z.enum(["Fax", "Home", "Main", "Mobile", "Night", "Other", "Work"]); export const phone = z.object({created_date: z.string().nullable().optional(), deleted_date: z.string().nullable().optional(), phone: z.string(), phone_type: phoneTypeEnum}); export const patientPreference = z.object({preferred_pharmacy_1: z.string().nullable().optional(), preferred_pharmacy_2: z.string().nullable().optional()}); export const preferredContactEnum = z.enum(["email", "passport", "phone", "sms"]); export const patientPreviousName = z.object({first_name: z.string().max(70).nullable().optional(), last_name: z.string().max(70).nullable().optional(), middle_name: z.string().max(50).nullable().optional(), suffix: z.string().max(20).nullable().optional()}); export const pronounsEnum = z.enum(["he_him_his", "not_listed", "she_her_hers", "they_them_theirs", "None"]); export const pronounsDisplayEnum = z.enum(["He/Him/His", "Option not listed", "She/Her/Hers", "They/Them/Theirs", "None"]); export const raceEnum = z.enum(["American Indian or Alaska Native", "Asian", "Black or African American", "Declined to specify", "Native Hawaiian or Other Pacific Islander", "No race specified", "White"]); export const patientSexEnum = z.enum(["Female", "Male", "Other", "Unknown"]); export const sexualOrientationEnum = z.enum(["asexual", "bisexual", "gay", "lesbian", "option_not_listed", "prefer_not_to_say", "queer", "straight", "unknown"]); export const timezoneEnum = z.enum(["Africa/Abidjan", "Africa/Accra", "Africa/Addis_Ababa", "Africa/Algiers", "Africa/Asmara", "Africa/Bamako", "Africa/Bangui", "Africa/Banjul", "Africa/Bissau", "Africa/Blantyre", "Africa/Brazzaville", "Africa/Bujumbura", "Africa/Cairo", "Africa/Casablanca", "Africa/Ceuta", "Africa/Conakry", "Africa/Dakar", "Africa/Dar_es_Salaam", "Africa/Djibouti", "Africa/Douala", "Africa/El_Aaiun", "Africa/Freetown", "Africa/Gaborone", "Africa/Harare", "Africa/Johannesburg", "Africa/Juba", "Africa/Kampala", "Africa/Khartoum", "Africa/Kigali", "Africa/Kinshasa", "Africa/Lagos", "Africa/Libreville", "Africa/Lome", "Africa/Luanda", "Africa/Lubumbashi", "Africa/Lusaka", "Africa/Malabo", "Africa/Maputo", "Africa/Maseru", "Africa/Mbabane", "Africa/Mogadishu", "Africa/Monrovia", "Africa/Nairobi", "Africa/Ndjamena", "Africa/Niamey", "Africa/Nouakchott", "Africa/Ouagadougou", "Africa/Porto-Novo", "Africa/Sao_Tome", "Africa/Tripoli", "Africa/Tunis", "Africa/Windhoek", "America/Adak", "America/Anchorage", "America/Anguilla", "America/Antigua", "America/Araguaina", "America/Argentina/Buenos_Aires", "America/Argentina/Catamarca", "America/Argentina/Cordoba", "America/Argentina/Jujuy", "America/Argentina/La_Rioja", "America/Argentina/Mendoza", "America/Argentina/Rio_Gallegos", "America/Argentina/Salta", "America/Argentina/San_Juan", "America/Argentina/San_Luis", "America/Argentina/Tucuman", "America/Argentina/Ushuaia", "America/Aruba", "America/Asuncion", "America/Atikokan", "America/Bahia", "America/Bahia_Banderas", "America/Barbados", "America/Belem", "America/Belize", "America/Blanc-Sablon", "America/Boa_Vista", "America/Bogota", "America/Boise", "America/Cambridge_Bay", "America/Campo_Grande", "America/Cancun", "America/Caracas", "America/Cayenne", "America/Cayman", "America/Chicago", "America/Chihuahua", "America/Ciudad_Juarez", "America/Costa_Rica", "America/Creston", "America/Cuiaba", "America/Curacao", "America/Danmarkshavn", "America/Dawson", "America/Dawson_Creek", "America/Denver", "America/Detroit", "America/Dominica", "America/Edmonton", "America/Eirunepe", "America/El_Salvador", "America/Fort_Nelson", "America/Fortaleza", "America/Glace_Bay", "America/Goose_Bay", "America/Grand_Turk", "America/Grenada", "America/Guadeloupe", "America/Guatemala", "America/Guayaquil", "America/Guyana", "America/Halifax", "America/Havana", "America/Hermosillo", "America/Indiana/Indianapolis", "America/Indiana/Knox", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Tell_City", "America/Indiana/Vevay", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Inuvik", "America/Iqaluit", "America/Jamaica", "America/Juneau", "America/Kentucky/Louisville", "America/Kentucky/Monticello", "America/Kralendijk", "America/La_Paz", "America/Lima", "America/Los_Angeles", "America/Lower_Princes", "America/Maceio", "America/Managua", "America/Manaus", "America/Marigot", "America/Martinique", "America/Matamoros", "America/Mazatlan", "America/Menominee", "America/Merida", "America/Metlakatla", "America/Mexico_City", "America/Miquelon", "America/Moncton", "America/Monterrey", "America/Montevideo", "America/Montserrat", "America/Nassau", "America/New_York", "America/Nome", "America/Noronha", "America/North_Dakota/Beulah", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/Nuuk", "America/Ojinaga", "America/Panama", "America/Paramaribo", "America/Phoenix", "America/Port-au-Prince", "America/Port_of_Spain", "America/Porto_Velho", "America/Puerto_Rico", "America/Punta_Arenas", "America/Rankin_Inlet", "America/Recife", "America/Regina", "America/Resolute", "America/Rio_Branco", "America/Santarem", "America/Santiago", "America/Santo_Domingo", "America/Sao_Paulo", "America/Scoresbysund", "America/Sitka", "America/St_Barthelemy", "America/St_Johns", "America/St_Kitts", "America/St_Lucia", "America/St_Thomas", "America/St_Vincent", "America/Swift_Current", "America/Tegucigalpa", "America/Thule", "America/Tijuana", "America/Toronto", "America/Tortola", "America/Vancouver", "America/Whitehorse", "America/Winnipeg", "America/Yakutat", "Antarctica/Casey", "Antarctica/Davis", "Antarctica/DumontDUrville", "Antarctica/Macquarie", "Antarctica/Mawson", "Antarctica/McMurdo", "Antarctica/Palmer", "Antarctica/Rothera", "Antarctica/Syowa", "Antarctica/Troll", "Antarctica/Vostok", "Arctic/Longyearbyen", "Asia/Aden", "Asia/Almaty", "Asia/Amman", "Asia/Anadyr", "Asia/Aqtau", "Asia/Aqtobe", "Asia/Ashgabat", "Asia/Atyrau", "Asia/Baghdad", "Asia/Bahrain", "Asia/Baku", "Asia/Bangkok", "Asia/Barnaul", "Asia/Beirut", "Asia/Bishkek", "Asia/Brunei", "Asia/Chita", "Asia/Choibalsan", "Asia/Colombo", "Asia/Damascus", "Asia/Dhaka", "Asia/Dili", "Asia/Dubai", "Asia/Dushanbe", "Asia/Famagusta", "Asia/Gaza", "Asia/Hebron", "Asia/Ho_Chi_Minh", "Asia/Hong_Kong", "Asia/Hovd", "Asia/Irkutsk", "Asia/Jakarta", "Asia/Jayapura", "Asia/Jerusalem", "Asia/Kabul", "Asia/Kamchatka", "Asia/Karachi", "Asia/Kathmandu", "Asia/Khandyga", "Asia/Kolkata", "Asia/Krasnoyarsk", "Asia/Kuala_Lumpur", "Asia/Kuching", "Asia/Kuwait", "Asia/Macau", "Asia/Magadan", "Asia/Makassar", "Asia/Manila", "Asia/Muscat", "Asia/Nicosia", "Asia/Novokuznetsk", "Asia/Novosibirsk", "Asia/Omsk", "Asia/Oral", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Pyongyang", "Asia/Qatar", "Asia/Qostanay", "Asia/Qyzylorda", "Asia/Riyadh", "Asia/Sakhalin", "Asia/Samarkand", "Asia/Seoul", "Asia/Shanghai", "Asia/Singapore", "Asia/Srednekolymsk", "Asia/Taipei", "Asia/Tashkent", "Asia/Tbilisi", "Asia/Tehran", "Asia/Thimphu", "Asia/Tokyo", "Asia/Tomsk", "Asia/Ulaanbaatar", "Asia/Urumqi", "Asia/Ust-Nera", "Asia/Vientiane", "Asia/Vladivostok", "Asia/Yakutsk", "Asia/Yangon", "Asia/Yekaterinburg", "Asia/Yerevan", "Atlantic/Azores", "Atlantic/Bermuda", "Atlantic/Canary", "Atlantic/Cape_Verde", "Atlantic/Faroe", "Atlantic/Madeira", "Atlantic/Reykjavik", "Atlantic/South_Georgia", "Atlantic/St_Helena", "Atlantic/Stanley", "Australia/Adelaide", "Australia/Brisbane", "Australia/Broken_Hill", "Australia/Darwin", "Australia/Eucla", "Australia/Hobart", "Australia/Lindeman", "Australia/Lord_Howe", "Australia/Melbourne", "Australia/Perth", "Australia/Sydney", "Canada/Atlantic", "Canada/Central", "Canada/Eastern", "Canada/Mountain", "Canada/Newfoundland", "Canada/Pacific", "Europe/Amsterdam", "Europe/Andorra", "Europe/Astrakhan", "Europe/Athens", "Europe/Belgrade", "Europe/Berlin", "Europe/Bratislava", "Europe/Brussels", "Europe/Bucharest", "Europe/Budapest", "Europe/Busingen", "Europe/Chisinau", "Europe/Copenhagen", "Europe/Dublin", "Europe/Gibraltar", "Europe/Guernsey", "Europe/Helsinki", "Europe/Isle_of_Man", "Europe/Istanbul", "Europe/Jersey", "Europe/Kaliningrad", "Europe/Kirov", "Europe/Kyiv", "Europe/Lisbon", "Europe/Ljubljana", "Europe/London", "Europe/Luxembourg", "Europe/Madrid", "Europe/Malta", "Europe/Mariehamn", "Europe/Minsk", "Europe/Monaco", "Europe/Moscow", "Europe/Oslo", "Europe/Paris", "Europe/Podgorica", "Europe/Prague", "Europe/Riga", "Europe/Rome", "Europe/Samara", "Europe/San_Marino", "Europe/Sarajevo", "Europe/Saratov", "Europe/Simferopol", "Europe/Skopje", "Europe/Sofia", "Europe/Stockholm", "Europe/Tallinn", "Europe/Tirane", "Europe/Ulyanovsk", "Europe/Vaduz", "Europe/Vatican", "Europe/Vienna", "Europe/Vilnius", "Europe/Volgograd", "Europe/Warsaw", "Europe/Zagreb", "Europe/Zurich", "GMT", "Indian/Antananarivo", "Indian/Chagos", "Indian/Christmas", "Indian/Cocos", "Indian/Comoro", "Indian/Kerguelen", "Indian/Mahe", "Indian/Maldives", "Indian/Mauritius", "Indian/Mayotte", "Indian/Reunion", "Pacific/Apia", "Pacific/Auckland", "Pacific/Bougainville", "Pacific/Chatham", "Pacific/Chuuk", "Pacific/Easter", "Pacific/Efate", "Pacific/Fakaofo", "Pacific/Fiji", "Pacific/Funafuti", "Pacific/Galapagos", "Pacific/Gambier", "Pacific/Guadalcanal", "Pacific/Guam", "Pacific/Honolulu", "Pacific/Kanton", "Pacific/Kiritimati", "Pacific/Kosrae", "Pacific/Kwajalein", "Pacific/Majuro", "Pacific/Marquesas", "Pacific/Midway", "Pacific/Nauru", "Pacific/Niue", "Pacific/Norfolk", "Pacific/Noumea", "Pacific/Pago_Pago", "Pacific/Palau", "Pacific/Pitcairn", "Pacific/Pohnpei", "Pacific/Port_Moresby", "Pacific/Rarotonga", "Pacific/Saipan", "Pacific/Tahiti", "Pacific/Tarawa", "Pacific/Tongatapu", "Pacific/Wake", "Pacific/Wallis", "US/Alaska", "US/Arizona", "US/Central", "US/Eastern", "US/Hawaii", "US/Mountain", "US/Pacific", "UTC"]); export const patient = z.object({actual_name: z.string().max(150).nullable().optional(), address: address.nullable().optional(), caregiver_practice: z.number().int(), consents: z.array(consent).optional(), created_date: z.string().nullable().optional(), deleted_date: z.string().nullable().optional(), deleted_insurances: z.array(insurance).optional(), dob: z.string(), emails: z.array(email).nullable().optional(), emergency_contact: emergencyContact.nullable().optional(), employer: employer.nullable().optional(), ethnicity: ethnicityEnum.optional(), first_name: z.string().max(70), gender_identity: genderIdentityEnum.optional(), guarantor: guarantor.nullable().optional(), id: z.number().int().optional(), insurances: z.array(insurance).optional(), last_modified: z.string().optional(), last_name: z.string().max(70), legal_gender_marker: z.union([legalGenderMarkerEnum, nullEnum]).optional(), legal_gender_marker_display: z.union([legalGenderMarkerDisplayEnum, nullEnum]).optional(), master_patient: z.number().int().optional(), merged_into_chart: z.number().int().nullable().optional(), metadata: z.object({data: z.object({}).optional(), object_id: z.string().optional(), object_web_link: z.string().optional()}).nullable().optional(), middle_name: z.string().max(50).optional(), mothers_maiden_name: z.string().max(70).nullable().optional(), notes: z.string().nullable().optional(), occupation: z.string().max(100).nullable().optional(), patient_status: status.nullable().optional(), phones: z.array(phone).optional(), preference: patientPreference.nullable().optional(), preferred_contact: z.union([preferredContactEnum, nullEnum]).optional(), preferred_language: z.string().nullable().optional(), preferred_service_location: z.number().int().nullable().optional(), previous_address: address.nullable().optional(), previous_first_name: z.string().max(70).nullable().optional(), previous_last_name: z.string().max(70).nullable().optional(), previous_name: patientPreviousName.nullable().optional(), primary_care_provider: z.number().int().optional(), primary_care_provider_npi: z.string().max(10).nullable().optional(), primary_physician: z.number().int(), pronouns: z.union([pronounsEnum, nullEnum]).optional(), pronouns_display: z.union([pronounsDisplayEnum, nullEnum]).optional(), race: raceEnum.optional(), sex: patientSexEnum, sexual_orientation: sexualOrientationEnum.optional(), sms_opt_in_status: z.boolean().nullable().optional(), ssn: z.string().max(37).nullable().optional(), suffix: z.string().max(20).optional(), tags: z.array(z.unknown()).nullable().optional(), timezone: z.union([timezoneEnum, nullEnum]).optional(), verified: z.boolean().optional(), vip: z.boolean().nullable().optional()}); export const paginatedPatientList = z.object({count: z.number().int().optional(), next: z.string().nullable().optional(), previous: z.string().nullable().optional(), results: z.array(patient)}); 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 }; /** * List Patients * * GET /api/2.0/patients/ */ export const getApiApi20Patients = async (args: GetApiApi20PatientsArgs, options?: GetApiApi20PatientsOptions) => { 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 (args.dob != null) query.append("dob", String(args.dob)) if (args.first_name != null) query.append("first_name", String(args.first_name)) if (args.group_id != null) query.append("group_id", String(args.group_id)) if (args.insurance_company != null) query.append("insurance_company", String(args.insurance_company)) if (args.insurance_plan != null) query.append("insurance_plan", String(args.insurance_plan)) if (args.last_modified__gt != null) query.append("last_modified__gt", String(args.last_modified__gt)) if (args.last_modified__gte != null) query.append("last_modified__gte", String(args.last_modified__gte)) if (args.last_modified__lt != null) query.append("last_modified__lt", String(args.last_modified__lt)) if (args.last_modified__lte != null) query.append("last_modified__lte", String(args.last_modified__lte)) if (args.last_name != null) query.append("last_name", String(args.last_name)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.master != null) query.append("master", String(args.master)) if (args.master_patient != null) query.append("master_patient", String(args.master_patient)) if (args.member_id != null) query.append("member_id", String(args.member_id)) if (args.offset != null) query.append("offset", String(args.offset)) if (args.order_by != null) query.append("order_by", String(args.order_by)) if (args.phone_number != null) query.append("phone_number", String(args.phone_number)) if (args.practice != null) query.append("practice", args.practice.join(',')) if (args.sex != null) query.append("sex", String(args.sex)) if (oauth2 !== undefined) headers.set('authorization', `Bearer ${oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/2.0/patients/${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(paginatedPatientList, await res.json()) };