import {z} from 'zod' export type BulkReportItem = {company_uuid: string, report_type: 'custom_report', columns: Array<'additional_earnings' | 'bank_account_account_number' | 'bank_account_routing_number' | 'bank_account_type' | 'bank_account' | 'bonus' | 'cash_tips' | 'check_amount' | 'check_date' | 'commission' | 'date_of_birth' | 'double_overtime_earnings' | 'double_overtime_hours' | 'double_overtime_rate' | 'employee_additional_taxes' | 'employee_benefit_contributions' | 'employee_compensation_time_period' | 'employee_compensation' | 'employee_deductions' | 'employee_department' | 'employee_email' | 'employee_donations' | 'employee_federal_income_tax' | 'employee_first_name' | 'employee_last_name' | 'employee_middle_initial' | 'employee_medicare_additional_tax' | 'employee_medicare_tax' | 'employee_phone_number' | 'employee_social_security_tax' | 'employee_state_income_tax' | 'employee_taxes' | 'employee_uuid' | 'employee_work_email' | 'employer_additional_taxes' | 'employer_benefit_contributions' | 'employer_cost' | 'employer_futa_tax' | 'employer_medicare_tax' | 'employer_social_security_tax' | 'employer_suta_tax' | 'employer_taxes' | 'employment_type' | 'employment' | 'end_date' | 'garnishments' | 'gross_earnings' | 'holiday_earnings' | 'holiday_hours' | 'home_address_city' | 'home_address_state' | 'home_address_street' | 'home_address_zip' | 'home_address' | 'job_title' | 'net_pay' | 'one_time_reimbursements' | 'overtime_earnings' | 'overtime_hours' | 'overtime_rate' | 'paid_time_off_earnings' | 'paid_time_off_hours' | 'paid_time_off_rate' | 'pay_period_end' | 'pay_period_start' | 'paycheck_tips' | 'payment_method' | 'payroll_type' | 'payroll_uuid' | 'preferred_first_name' | 'recurring_reimbursements' | 'regular_earnings' | 'regular_hours' | 'regular_rate' | 'reimbursements' | 'risk_class_code' | 'sick_rate' | 'sick_time_off_earnings' | 'sick_time_off_hours' | 'start_date' | 'total_employer_benefit_contributions' | 'total_time_off_earnings' | 'total_time_off_hours' | 'work_address_city' | 'work_address_street' | 'work_address_zip'>, groupings?: (Array<'payroll' | 'employee' | 'work_address' | 'work_address_state'>) | undefined, file_type: 'csv' | 'json' | 'pdf', custom_name?: string | undefined, with_totals?: boolean | undefined, date_filter_type?: ('period_end_date' | 'period_start_date' | 'check_date') | undefined, start_date?: string | undefined, end_date?: string | undefined, payment_method?: ('check' | 'direct_deposit') | undefined, employment_type?: ('exempt' | 'salaried_nonexempt' | 'nonexempt' | 'commission_only_exempt' | 'commission_only_nonexempt') | undefined, employment_status?: ('active_full_time' | 'active_part_time' | 'active_part_time_eligible' | 'active_variable' | 'active_seasonal' | 'active' | 'dismissed') | undefined, employee_uuids?: (Array | null) | undefined, department_uuids?: Array | undefined, work_address_uuids?: Array | undefined} | {company_uuid: string, report_type: 'general_ledger', payroll_uuid: string, aggregation: 'default' | 'job' | 'department' | 'integration', integration_type?: (string | null) | undefined}; export type BulkReportBody = {batch: Array}; export type CreateApiV1BulkReportsArgs = {'X-Gusto-API-Version'?: '2026-06-15' | undefined, body: BulkReportBody}; export type CreateApiV1BulkReportsOptions = {baseUrl?: string | undefined, SystemAccessAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const createBulkReport = z.object({uuid: z.string(), status: z.enum(["pending", "processing", "completed", "failed"])}); 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 }; /** * Create a bulk report batch * * POST /v1/bulk_reports */ export const createApiV1BulkReports = async (args: CreateApiV1BulkReportsArgs, options?: CreateApiV1BulkReportsOptions) => { const {baseUrl = "https://api.gusto-demo.com", fetch: fetchFn = fetch, SystemAccessAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['X-Gusto-API-Version'] != null) headers.set("X-Gusto-API-Version", String(args['X-Gusto-API-Version'])) if (SystemAccessAuth !== undefined) headers.set('authorization', `Bearer ${SystemAccessAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/bulk_reports${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(createBulkReport, await res.json()) };