import {z} from 'zod' export type ExpenseListParams = {search?: string | undefined, sort?: string | undefined, order?: string | undefined, count?: number | undefined, page?: number | undefined, limit?: number | undefined, startDate?: string | undefined, endDate?: string | undefined, taskId?: string | undefined, documentId?: string | undefined, organizationId?: string | undefined, filter?: string | undefined, projectIds?: Array | undefined, taskIds?: Array | undefined, offset?: number | undefined}; export type CreateApiV1ExpensesSearchArgs = {body: ExpenseListParams}; export type CreateApiV1ExpensesSearchOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const customerSubscriptionDto = z.object({id: z.string().optional(), user: z.string().optional(), expires: z.number().int().optional(), status: z.number().int().optional(), plan: z.number().int().optional(), licenses: z.number().int().optional(), scheduledPlan: z.number().int().optional(), scheduledLicenses: z.number().int().optional(), scheduledDate: z.number().int().optional(), paymentOption: z.string().optional(), business: z.string().optional(), email: z.string().optional(), firstname: z.string().optional(), lastname: z.string().optional(), vatId: z.string().optional(), displayName: z.string().optional(), street: z.string().optional(), city: z.string().optional(), state: z.string().optional(), zip: z.string().optional(), country: z.string().optional(), countryIso: z.string().optional(), language: z.string().optional(), includeTaxForBusiness: z.boolean().optional(), activated: z.boolean().optional(), pastDue: z.boolean().optional(), cancellationOffer: z.boolean().optional(), subscriptionActive: z.boolean().optional(), subscriptionCancelled: z.boolean().optional(), subscriptionInactive: z.boolean().optional(), paymentProviderActive: z.boolean().optional(), startedTestimonial: z.string().optional(), activationDate: z.string().optional(), cancellationDate: z.string().optional(), permissionAdmin: z.boolean().optional(), activatedTeams: z.boolean().optional(), valid: z.boolean().optional(), expired: z.boolean().optional(), validAndActivated: z.boolean().optional(), payPalPayment: z.boolean().optional(), stripePayment: z.boolean().optional(), invoicePayment: z.boolean().optional(), googlePlayPayment: z.boolean().optional(), appleStorePayment: z.boolean().optional(), currency: z.string().optional(), businessCustomer: z.boolean().optional(), euCustomer: z.boolean().optional(), eu: z.boolean().optional(), at: z.boolean().optional(), ch: z.boolean().optional(), uk: z.boolean().optional(), product: z.string().optional(), licenseQuantity: z.number().int().optional(), active: z.boolean().optional(), trial: z.boolean().optional(), cancelled: z.boolean().optional(), member: z.boolean().optional(), businessOrTrial: z.boolean().optional(), pro: z.boolean().optional(), planEnterprise: z.boolean().optional(), planBusiness: z.boolean().optional(), planPro: z.boolean().optional(), planPlus: z.boolean().optional(), planBasic: z.boolean().optional(), monthlyPlan: z.boolean().optional(), yearlyPlan: z.boolean().optional(), organization: z.boolean().optional()}); export const organizationPermissionDto = z.object({invoicing: z.boolean().optional(), billing: z.boolean().optional(), admin: z.boolean().optional()}); export const organizationDto = z.object({id: z.string().optional(), name: z.string().optional(), description: z.string().optional(), image: z.string().optional(), color: z.number().int().optional(), subscription: customerSubscriptionDto.optional(), user: z.string().optional(), aiChatEnabled: z.boolean().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), deleted: z.boolean().optional(), permission: organizationPermissionDto.optional(), former: z.boolean().optional()}); export const teamPermissionDto = z.object({role: z.string().optional(), owner: z.boolean().optional(), manager: z.boolean().optional(), member: z.boolean().optional(), managerOrOwner: z.boolean().optional()}); export const teamDto = z.object({id: z.string().optional(), organization: organizationDto.optional(), organizationId: z.string().optional(), name: z.string().optional(), description: z.string().optional(), image: z.string().optional(), color: z.number().int().optional(), projectSalaryVisibility: z.number().int().optional(), user: z.string().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), deleted: z.boolean().optional(), permission: teamPermissionDto.optional(), organizationAdmin: z.boolean().optional(), projects: z.number().int().optional(), members: z.number().int().optional(), projectSalaryVisible: z.boolean().optional()}); export const projectPermissionDto = z.object({role: z.string().optional(), owner: z.boolean().optional(), manager: z.boolean().optional(), member: z.boolean().optional(), managerOrOwner: z.boolean().optional()}); export const projectDto = z.object({id: z.string().optional(), user: z.string().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), deleted: z.boolean().optional(), title: z.string().optional(), description: z.string().optional(), employer: z.string().optional(), office: z.string().optional(), color: z.number().int().optional(), taskDefaultBillable: z.boolean().optional(), archived: z.boolean().optional(), salaryVisibility: z.number().int().optional(), salary: z.string().optional(), team: teamDto.optional(), permission: projectPermissionDto.optional(), duration: z.number().int().optional(), durationBreak: z.number().int().optional(), salaryTotal: z.string().optional(), salaryBreak: z.string().optional(), expenses: z.string().optional(), expensesPaid: z.string().optional(), mileage: z.string().optional(), todoEstimatedDuration: z.number().int().optional(), todoTrackedDuration: z.number().int().optional(), todoCount: z.number().int().optional(), titleAndClient: z.string().optional(), salaryVisible: z.boolean().optional()}); export const activity = z.object({projectId: z.string().optional(), projectTitle: z.string().optional(), projectColor: z.number().int().optional(), taskId: z.string().optional(), startDateTime: z.string().optional(), endDateTime: z.string().optional(), location: z.string().optional(), running: z.boolean().optional()}); export const member = z.object({uid: z.string().optional(), firstname: z.string().optional(), lastname: z.string().optional(), email: z.string().optional(), employeeId: z.string().optional(), imageUrl: z.string().optional(), deleted: z.boolean().optional(), activity: activity.optional(), displayName: z.string().optional(), initials: z.string().optional()}); export const toDoDto = z.object({id: z.string().optional(), user: z.string().optional(), deleted: z.boolean().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), project: projectDto.optional(), name: z.string().optional(), description: z.string().optional(), status: z.number().int().optional(), dueDate: z.string().optional(), assignedUsers: z.string().optional(), assignedMembers: z.array(member).optional(), estimatedHours: z.number().int().optional(), estimatedMinutes: z.number().int().optional(), duration: z.number().int().optional(), durationBreak: z.number().int().optional(), salaryTotal: z.string().optional(), salaryBreak: z.string().optional(), expenses: z.string().optional(), expensesPaid: z.string().optional(), mileage: z.string().optional(), progress: z.number().optional()}); export const rateDto = z.object({id: z.string().optional(), user: z.string().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), deleted: z.boolean().optional(), title: z.string().optional(), factor: z.string().optional(), extra: z.string().optional(), enabled: z.boolean().optional(), archived: z.boolean().optional(), team: teamDto.optional()}); export const tagDto = z.object({id: z.string().optional(), user: z.string().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), deleted: z.boolean().optional(), name: z.string().optional(), color: z.number().int().optional(), archived: z.boolean().optional(), team: teamDto.optional(), totalTime: z.number().int().optional()}); export const pauseDto = z.object({id: z.string().optional(), user: z.string().optional(), deleted: z.boolean().optional(), running: z.boolean().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), description: z.string().optional(), startDateTime: z.string().optional(), endDateTime: z.string().optional(), task: z.lazy(() => taskDto.optional()), member: member.optional()}); export const noteDto = z.object({id: z.string().optional(), user: z.string().optional(), deleted: z.boolean().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), text: z.string().optional(), dateTime: z.string().optional(), uri: z.string().optional(), driveId: z.string().optional(), task: z.lazy(() => taskDto.optional()), member: member.optional()}); export const taskDto: z.ZodType = z.object({id: z.string().optional(), user: z.string().optional(), deleted: z.boolean().optional(), running: z.boolean().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), description: z.string().optional(), location: z.string().optional(), locationEnd: z.string().optional(), startDateTime: z.string().optional(), endDateTime: z.string().optional(), feeling: z.number().int().optional(), typeId: z.number().int().optional(), paid: z.boolean().optional(), billed: z.boolean().optional(), billable: z.boolean().optional(), phoneNumber: z.string().optional(), distance: z.string().optional(), signature: z.string().optional(), project: projectDto.optional(), todo: toDoDto.optional(), rate: rateDto.optional(), member: member.optional(), invoiceId: z.string().optional(), tags: z.array(tagDto).optional(), pauses: z.array(pauseDto).optional(), expenses: z.array(z.lazy(() => expenseDto)).optional(), notes: z.array(noteDto).optional(), duration: z.number().int().optional(), durationBreak: z.number().int().optional(), salaryTotal: z.string().optional(), salaryBreak: z.string().optional(), expensesTotal: z.string().optional(), expensesPaid: z.string().optional(), expensesCount: z.number().int().optional(), expensesPaidCount: z.number().int().optional(), mileage: z.string().optional(), notesTotal: z.number().int().optional(), salaryVisible: z.boolean().optional()}); export const expenseDto: z.ZodType = z.object({id: z.string().optional(), user: z.string().optional(), deleted: z.boolean().optional(), lastUpdate: z.number().int().optional(), created: z.number().int().optional(), description: z.string().optional(), dateTime: z.string().optional(), amount: z.string().optional(), refunded: z.boolean().optional(), fileUri: z.string().optional(), fileName: z.string().optional(), task: taskDto.optional(), member: member.optional(), invoiceId: z.string().optional()}); export const listParams = z.object({search: z.string().optional(), sort: z.string().optional(), order: z.string().optional(), count: z.number().int().optional(), page: z.number().int().optional(), limit: z.number().int().optional(), offset: z.number().int().optional()}); export const expenseList = z.object({items: z.array(expenseDto).optional(), params: listParams.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 }; /** * Search expenses * * POST /v1/expenses/search * * Also accepts auth: apiKeyAuth */ export const createApiV1ExpensesSearch = async (args: CreateApiV1ExpensesSearchArgs, options?: CreateApiV1ExpensesSearchOptions) => { const {baseUrl = "https://api.timesheet.io", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/expenses/search${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(expenseList, await res.json()) };