import {z} from 'zod' export type GetApiClientsArgs = {Page?: number | undefined, PageSize?: number | undefined, Query?: string | undefined, ExternalTenantId?: string | undefined, IsAttributedClient?: boolean | undefined, DateCreatedFrom?: string | undefined, DateCreatedTo?: string | undefined, OnboardingDone?: boolean | undefined, Sort?: string | undefined}; export type GetApiClientsOptions = {baseUrl?: string | undefined, ApiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const debituraDomainModelBasePageData = z.object({totalResults: z.number().int().optional(), pageSize: z.number().int().optional(), currentPage: z.number().int().optional(), responseCount: z.number().int().optional(), totalPages: z.number().int().optional()}); export const debituraWebReferralPartnerApiModelsClientsClientsSummary = z.object({totalClients: z.number().int().optional(), attributedClients: z.number().int().optional(), onboardingComplete: z.number().int().optional(), onboardingPending: z.number().int().optional(), totalCases: z.number().int().optional()}); export const debituraWebReferralPartnerApiModelsClientsOnboardingLinksDto = z.object({url: z.string().nullable().optional()}); export const debituraWebReferralPartnerApiModelsClientsCreditorDto = z.object({id: z.string().optional(), companyName: z.string().nullable().optional(), officeEmail: z.string().nullable().optional(), country: z.string().nullable().optional(), address: z.string().nullable().optional(), city: z.string().nullable().optional(), zipCode: z.string().nullable().optional(), companyRegistrationNumber: z.string().nullable().optional()}); export const debituraWebReferralPartnerApiModelsClientsUserDto = z.object({id: z.number().int().optional(), email: z.string().nullable().optional(), firstName: z.string().nullable().optional(), lastName: z.string().nullable().optional()}); export const debituraWebReferralPartnerApiModelsClientsClientCaseStats = z.object({casesTotal: z.number().int().optional(), casesClosed: z.number().int().optional(), earningsUsd: z.number().optional()}); export const debituraWebReferralPartnerApiModelsClientsKycStatus = z.enum(["NotRequired", "Pending", "Verified"]); export const debituraWebReferralPartnerApiModelsClientsKycVerificationDto = z.object({directorFullName: z.string().nullable().optional(), directorHomeAddress: z.string().nullable().optional(), directorDateOfBirth: z.string().optional(), dateCreated: z.string().optional(), verificationStatus: z.enum(["Processing", "Completed", "null"]).nullable().optional(), verificationStatusUpdatedAt: z.string().nullable().optional()}); export const debituraWebExternalApiContractsV1CasesDebtorDto = z.object({type: z.string().min(1), name: z.string().min(1), contactPerson: z.string().nullable().optional(), companyRegistrationNumber: z.string().nullable().optional(), address: z.string().nullable().optional(), zipCode: z.string().nullable().optional(), city: z.string().nullable().optional(), state: z.string().nullable().optional(), stateAlpha2: z.string().nullable().optional(), countryAlpha2: z.string().nullable().optional(), country: z.string().nullable().optional(), email: z.string().nullable().optional(), phone: z.string().nullable().optional()}); export const debituraWebExternalApiContractsV1CasesSurveyCadenceModeDto = z.union([z.literal(0), z.literal(1)]); export const debituraWebExternalApiContractsV1CasesCollectionPartnerDto = z.object({name: z.string().nullable().optional(), officeEmail: z.string().nullable().optional(), officePhone: z.string().nullable().optional(), publicSite: z.string().nullable().optional(), surveyCadenceMode: debituraWebExternalApiContractsV1CasesSurveyCadenceModeDto.optional()}); export const debituraWebExternalApiContractsV1CasesCreditorDivisionDto = z.object({id: z.string().optional(), name: z.string().nullable().optional()}); export const debituraWebExternalApiContractsV1CasesCreditorDto = z.object({id: z.string().optional(), companyName: z.string().nullable().optional(), companyRegistrationNumber: z.string().nullable().optional(), officeEmail: z.string().nullable().optional(), officePhone: z.string().nullable().optional(), address: z.string().nullable().optional(), city: z.string().nullable().optional(), zipCode: z.string().nullable().optional(), state: z.string().nullable().optional(), country: z.string().nullable().optional(), division: debituraWebExternalApiContractsV1CasesCreditorDivisionDto.optional()}); export const debituraWebExternalApiContractsV1CasesBankAccountDto = z.object({id: z.number().int().optional(), label: z.string().nullable().optional(), scheme: z.string().nullable().optional(), currencyCode: z.string().nullable().optional(), bankCountryCode: z.string().nullable().optional(), accountHolderName: z.string().nullable().optional(), iban: z.string().nullable().optional(), bic: z.string().nullable().optional(), accountNumber: z.string().nullable().optional(), localIdentifier: z.string().nullable().optional(), localIdentifierType: z.string().nullable().optional(), bankName: z.string().nullable().optional(), bankAddress: z.string().nullable().optional(), bankCity: z.string().nullable().optional(), bankZipCode: z.string().nullable().optional(), bankState: z.string().nullable().optional()}); export const debituraWebExternalApiContractsV1CasesSigningHandoffDto = z.object({combinedSigningUrl: z.string().nullable().optional()}); export const debituraWebExternalApiContractsV1CasesCaseValidationLeanDto = z.object({needsInfo: z.boolean().optional()}); export const debituraWebExternalApiContractsV1CasesAssignedUserDto = z.object({email: z.string().nullable().optional(), name: z.string().nullable().optional()}); export const debituraWebExternalApiContractsV1CasesInvoiceAllocationOutstandingDto = z.object({principal: z.number().optional(), interest: z.number().optional(), reminderFees: z.number().optional(), collectionFees: z.number().optional()}); export const debituraWebExternalApiContractsV1CasesInvoiceDto = z.object({id: z.string().optional(), dateCreated: z.string().optional(), dateUpdated: z.string().nullable().optional(), reference: z.string().nullable().optional(), creditorReference: z.string().nullable().optional(), creditorComments: z.string().nullable().optional(), claimDescription: z.string().nullable().optional(), grossAmount: z.number().optional(), remainder: z.number().optional(), interestFees: z.number().optional(), reminderFees: z.number().optional(), collectionFees: z.number().optional(), totalAddedFees: z.number().optional(), currency: z.string().nullable().optional(), isTestCase: z.boolean().optional(), lifecycle: z.string().nullable().optional(), dueDate: z.string().optional(), date: z.string().optional(), dateFinished: z.string().nullable().optional(), dateCollectionStarted: z.string().nullable().optional(), closeCode: z.string().nullable().optional(), currentEngagementPhase: z.string().nullable().optional(), claimType: z.string().nullable().optional(), creditorDivisionId: z.string().nullable().optional(), debtor: debituraWebExternalApiContractsV1CasesDebtorDto.optional(), collectionPartner: debituraWebExternalApiContractsV1CasesCollectionPartnerDto.optional(), creditor: debituraWebExternalApiContractsV1CasesCreditorDto.optional(), bankAccount: debituraWebExternalApiContractsV1CasesBankAccountDto.optional(), blendedAgeUpliftPoints: z.number().nullable().optional(), preLegalSuccessFee: z.number().nullable().optional(), solutionUrl: z.string().nullable().optional(), signingHandoff: debituraWebExternalApiContractsV1CasesSigningHandoffDto.optional(), exclusivePeriodEndDate: z.string().nullable().optional(), disputeStatus: z.string().nullable().optional(), validation: debituraWebExternalApiContractsV1CasesCaseValidationLeanDto.optional(), assignedUser: debituraWebExternalApiContractsV1CasesAssignedUserDto.optional(), allocationOutstanding: debituraWebExternalApiContractsV1CasesInvoiceAllocationOutstandingDto.optional()}); export const debituraWebReferralPartnerApiModelsClientsCaseCreationFailure = z.object({caseIndex: z.number().int().optional(), creditorReference: z.string().nullable().optional(), errorType: z.string().nullable().optional(), errorMessage: z.string().nullable().optional(), validationErrors: z.record(z.string(), z.array(z.string())).nullable().optional(), signingHandoff: debituraWebExternalApiContractsV1CasesSigningHandoffDto.optional()}); export const debituraWebReferralPartnerApiModelsClientsMultiCaseResult = z.object({successfulCases: z.array(debituraWebExternalApiContractsV1CasesInvoiceDto).nullable().optional(), failedCases: z.array(debituraWebReferralPartnerApiModelsClientsCaseCreationFailure).nullable().optional()}); export const debituraWebReferralPartnerApiModelsClientsClientCreatedResponse = z.object({externalTenantId: z.string().nullable().optional(), onboardingDone: z.boolean().optional(), onboardingLinks: debituraWebReferralPartnerApiModelsClientsOnboardingLinksDto.optional(), client: debituraWebReferralPartnerApiModelsClientsCreditorDto.optional(), users: z.array(debituraWebReferralPartnerApiModelsClientsUserDto).nullable().optional(), isAttributedClient: z.boolean().optional(), dateLinked: z.string().optional(), caseStats: debituraWebReferralPartnerApiModelsClientsClientCaseStats.optional(), kycStatus: debituraWebReferralPartnerApiModelsClientsKycStatus.optional(), kycVerification: debituraWebReferralPartnerApiModelsClientsKycVerificationDto.optional(), caseResults: debituraWebReferralPartnerApiModelsClientsMultiCaseResult.optional()}); export const debituraWebReferralPartnerApiModelsClientsGetClientsResponse = z.object({page: debituraDomainModelBasePageData.optional(), summary: debituraWebReferralPartnerApiModelsClientsClientsSummary.optional(), clients: z.array(debituraWebReferralPartnerApiModelsClientsClientCreatedResponse).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 }; /** * List all linked clients * * GET /clients */ export const getApiClients = async (args: GetApiClientsArgs, options?: GetApiClientsOptions) => { const {baseUrl = "https://referral-api.debitura.com", fetch: fetchFn = fetch, ApiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.Page != null) query.append("Page", String(args.Page)) if (args.PageSize != null) query.append("PageSize", String(args.PageSize)) if (args.Query != null) query.append("Query", String(args.Query)) if (args.ExternalTenantId != null) query.append("ExternalTenantId", String(args.ExternalTenantId)) if (args.IsAttributedClient != null) query.append("IsAttributedClient", String(args.IsAttributedClient)) if (args.DateCreatedFrom != null) query.append("DateCreatedFrom", String(args.DateCreatedFrom)) if (args.DateCreatedTo != null) query.append("DateCreatedTo", String(args.DateCreatedTo)) if (args.OnboardingDone != null) query.append("OnboardingDone", String(args.OnboardingDone)) if (args.Sort != null) query.append("Sort", String(args.Sort)) if (ApiKey !== undefined) headers.set("XApiKey", ApiKey) const url = `${baseUrl.replace(/\/+$/, '')}/clients${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(debituraWebReferralPartnerApiModelsClientsGetClientsResponse, await res.json()) };