import {z} from 'zod' export type GetApiClinicConfigOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const paymentMethodNoticeDto = z.object({surfaceKey: z.string().optional(), text: z.string().optional(), severity: z.string().optional()}); export const financialSettingsDto = z.object({stateTaxRate: z.union([z.number(), z.string()]).optional(), countyTaxRate: z.union([z.number(), z.string()]).optional(), cityTaxRate: z.union([z.number(), z.string()]).optional(), quickAddServiceIds: z.array(z.string()).nullable().optional(), xplorPayEnabled: z.boolean().optional(), xplorPayTestMode: z.boolean().optional(), xplorPayCredentialsConfigured: z.boolean().optional(), xplorPayTerminalApiKey: z.string().nullable().optional(), xplorPayPayLinkApiKey: z.string().nullable().optional(), markAsPaidTypes: z.array(z.string()).nullable().optional(), defaultPaymentTermsDays: z.union([z.number().int(), z.string()]).optional(), passProcessingFeesToClient: z.boolean().optional(), depositAccount: z.string().nullable().optional(), accountingMode: z.string().nullable().optional(), taxMode: z.string().nullable().optional(), vatStandardRate: z.union([z.number(), z.string()]).optional(), vatReducedRate: z.union([z.number(), z.string()]).optional(), discountStackingMode: z.string().optional(), autoCategoryGroups: z.boolean().optional(), paymentMethodNotices: z.array(paymentMethodNoticeDto).nullable().optional()}); export const communicationsSettingsDto = z.object({preHistoryFormsEnabled: z.boolean().optional(), formSendCadence: z.string().optional(), smsEnabled: z.boolean().optional(), defaultCallerId: z.string().nullable().optional(), lowStockAlertsEnabled: z.boolean().optional(), newClientNotificationsEnabled: z.boolean().optional(), coldChainBreachAlertEnabled: z.boolean().optional(), equipmentFailureAlertEnabled: z.boolean().optional(), telnyxPhoneNumber: z.string().nullable().optional(), telnyxApiKeyArn: z.string().nullable().optional(), smsConsentEnabled: z.boolean().optional(), smsConsentBrandName: z.string().nullable().optional(), smsConsentUseCases: z.string().optional(), smsFileLinkExpiryDays: z.union([z.number().int(), z.string()]).optional()}); export const inventorySettingsDto = z.object({defaultItemMarkup: z.union([z.number(), z.string()]).optional(), expiryTrackingEnabled: z.boolean().optional(), parLevelMedications: z.union([z.number().int(), z.string()]).optional(), parLevelVaccines: z.union([z.number().int(), z.string()]).optional(), parLevelSupplies: z.union([z.number().int(), z.string()]).optional(), parLevelFood: z.union([z.number().int(), z.string()]).optional(), valuationMethod: z.string().optional(), defaultVendor: z.string().nullable().optional(), preferredShippingMethod: z.string().optional(), vendorAccountId: z.string().nullable().optional(), backorderSubstitutionsEnabled: z.boolean().optional(), vetcoveEnabled: z.boolean().optional(), vetcoveApiKey: z.string().nullable().optional(), vetcoveApiKeyConfigured: z.boolean().optional(), vetcoveApiKeyArn: z.string().nullable().optional(), covetrusEnabled: z.boolean().optional(), covetrusApiKey: z.string().nullable().optional(), covetrusApiKeyConfigured: z.boolean().optional(), covetrusApiKeyArn: z.string().nullable().optional(), transmissionMethod: z.string().optional(), defaultOnlinePharmacy: z.string().optional(), clientPharmacyOverridesAllowed: z.boolean().optional(), defaultDispenseFee: z.union([z.number(), z.string()]).optional(), defaultDispenseUnit: z.string().optional(), genericSubstitutionAllowed: z.boolean().optional(), showDispenseFeesSeparately: z.boolean().optional(), labelBranding: z.string().nullable().optional(), multiLanguageLabelsEnabled: z.boolean().optional(), autoLogDeaRegister: z.boolean().optional(), mfaForControlledRx: z.boolean().optional(), barcodeScanBeforeDispense: z.boolean().optional(), refrigeratedMedSensors: z.boolean().optional(), enforceVcprCheck: z.boolean().optional(), vcprRequiredDays: z.union([z.number().int(), z.string()]).optional(), maxDispenseQuantity: z.union([z.number(), z.string()]).optional(), negativeInventoryMode: z.string().nullable().optional(), overdraftSettlementMode: z.string().nullable().optional(), allowAppointmentDispenseWithoutWitness: z.boolean().nullable().optional(), automatedCountsEnabled: z.boolean().optional(), countFrequency: z.string().optional(), salesVelocityReportEnabled: z.boolean().optional()}); export const diagnosticsSettingsDto = z.object({courierCutoffTime: z.string().nullable().optional(), autoAttachLabResults: z.boolean().optional(), dicomAeTitle: z.string().nullable().optional(), dicomIp: z.string().nullable().optional(), dicomPort: z.union([z.number().int(), z.string()]).nullable().optional(), imagingRetentionPolicy: z.string().optional(), autoRouteImages: z.boolean().optional(), teleradiologyVetRad: z.boolean().optional(), teleradiologyStatRad: z.boolean().optional(), autoSubmitStudies: z.boolean().optional(), autoSyncWithRecords: z.boolean().optional(), calibrationAlertsEnabled: z.boolean().optional(), scoutDistressDetection: z.boolean().optional(), scoutPulseCheck: z.boolean().optional(), tempMonitoringEnabled: z.boolean().optional(), fridgeFreezerSensors: z.boolean().optional(), pawsTvEnabled: z.boolean().optional(), pawsTvDefaultChannel: z.string().nullable().optional(), criticalLabResultAlerts: z.boolean().optional(), statCaseResultAlerts: z.boolean().optional(), equipmentCalibrationAlerts: z.boolean().optional()}); export const aiModelConfigDto = z.object({provider: z.string().optional(), modelId: z.string().optional(), tier: z.string().nullable().optional()}); export const widgetChatbotConfigDto = z.object({enabled: z.boolean().optional(), welcomeMessage: z.string().nullable().optional(), schedulingEnabled: z.boolean().optional(), medicationRefillEnabled: z.boolean().optional(), triageEnabled: z.boolean().optional(), intakeEnabled: z.boolean().optional(), requireVerificationForScheduling: z.boolean().optional(), maxConversationTurns: z.union([z.number().int(), z.string()]).optional(), autoEscalateEmergencies: z.boolean().optional(), emergencyReferralName: z.string().nullable().optional(), emergencyReferralPhone: z.string().nullable().optional(), emergencyReferralAddress: z.string().nullable().optional(), model: aiModelConfigDto.optional()}); export const aiSettingsDto = z.object({modelTiers: z.boolean().optional(), patientSummariesEnabled: z.boolean().optional(), chartNotesGenerationEnabled: z.boolean().optional(), defaultSummaryTemplate: z.string().optional(), displayAiLabels: z.boolean().optional(), displayConfidenceScores: z.boolean().optional(), aiEmailResponsesEnabled: z.boolean().optional(), publicPortalChatbotEnabled: z.boolean().optional(), chatbotPersona: z.string().optional(), aiLabAnalysisEnabled: z.boolean().optional(), aiRadiologyAnalysisEnabled: z.boolean().optional(), anonymizeForAiProcessing: z.boolean().optional(), shareAnonymizedDataGlobalMcp: z.boolean().optional(), requireDoctorReviewForAi: z.boolean().optional(), ga4ClarityEnabled: z.boolean().optional(), triageModel: aiModelConfigDto.optional(), assistantModel: aiModelConfigDto.optional(), vipModel: aiModelConfigDto.optional(), noteStyleInstructions: z.string().nullable().optional(), soapNotesModel: aiModelConfigDto.optional(), dischargeDocsModel: aiModelConfigDto.optional(), widgetChatbot: widgetChatbotConfigDto.nullable().optional()}); export const clinicIdentitySettingsDto = z.object({ownershipType: z.string().nullable().optional(), parentOrganization: z.string().nullable().optional(), ownershipStatement: z.string().nullable().optional(), vatRegistrationNumber: z.string().nullable().optional()}); export const complianceSettingsDto = z.object({hipaaCompliance: z.boolean().optional(), dataRetentionPolicy: z.string().optional(), notificationRetentionDays: z.union([z.number().int(), z.string()]).nullable().optional(), clinicIdentity: clinicIdentitySettingsDto.optional(), publicPricingEnabled: z.boolean().optional(), rxTransparencyEnabled: z.boolean().optional(), estimateBeforeTreatmentEnabled: z.boolean().optional(), requireUsdaNumberForRabiesCertificates: z.boolean().optional(), promptNextDueAtAdministration: z.boolean().optional(), controlledDrugRegisterEnabled: z.boolean().optional(), antimicrobialStewardshipEnabled: z.boolean().optional(), cascadeWorkflowEnabled: z.boolean().optional(), vcprEnforcementEnabled: z.boolean().optional()}); export const clientAppSettingsDto = z.object({savedPaymentMethodsAllowed: z.boolean().optional(), useCardOnFileAllowed: z.boolean().optional(), sendInvoicesToApp: z.boolean().optional(), preAuthRequired: z.boolean().optional(), endOfVisitPaymentsAllowed: z.boolean().optional(), clientAppNotes: z.string().nullable().optional()}); export const regionSettingsDto = z.object({regionCode: z.string().optional(), currencyCode: z.string().optional(), weightSystem: z.string().optional(), temperatureSystem: z.string().optional(), distanceSystem: z.string().optional()}); export const transparencyPageSettingsDto = z.object({heroImageLogoId: z.string().nullable().optional(), prescriptionPolicy: z.string().nullable().optional(), outOfHoursProviderName: z.string().nullable().optional(), outOfHoursProviderHours: z.string().nullable().optional(), outOfHoursInitialFee: z.union([z.number(), z.string()]).nullable().optional(), outOfHoursPhone: z.string().nullable().optional()}); export const erxSettingsDto = z.object({vetHubRxEnabled: z.boolean().optional()}); export const surgerySettingsDto = z.object({pushLoggedDrugsToPlan: z.boolean().optional()}); export const recordExportOrder = z.number().int(); export const recordExportSettingsDto = z.object({defaultOrder: recordExportOrder.optional()}); export const clinicConfigDto = z.object({id: z.string().optional(), financial: financialSettingsDto.optional(), communications: communicationsSettingsDto.optional(), inventory: inventorySettingsDto.optional(), diagnostics: diagnosticsSettingsDto.optional(), ai: aiSettingsDto.optional(), compliance: complianceSettingsDto.optional(), clientApp: clientAppSettingsDto.optional(), region: regionSettingsDto.optional(), transparencyPage: transparencyPageSettingsDto.optional(), erx: erxSettingsDto.optional(), surgery: surgerySettingsDto.optional(), recordExport: recordExportSettingsDto.optional(), createdAt: z.string().optional(), updatedAt: z.string().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 }; /** * Get all clinic configuration domains * * GET /clinic-config */ export const getApiClinicConfig = async (options?: GetApiClinicConfigOptions) => { const {baseUrl = "https://api.clinicos.vet/backend/business", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/clinic-config${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(clinicConfigDto, await res.json()) };