@orvello/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRACT_SHA256 +1 -0
- package/LICENSE +21 -0
- package/README.md +262 -0
- package/dist/contract.cjs +4968 -0
- package/dist/contract.cjs.map +1 -0
- package/dist/contract.d.cts +30468 -0
- package/dist/contract.d.ts +30468 -0
- package/dist/contract.js +4937 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.cjs +748 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +222 -0
- package/dist/index.d.ts +222 -0
- package/dist/index.js +737 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi.json +53764 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contract-hash.ts","../src/diagnose.ts","../src/helpers.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// GENERATED by scripts/sync-contract.mjs — do not edit by hand.\n//\n// The fingerprint of the node-bill contract vendored into this package, using\n// the same digest as `sync-contract.mjs` and as node-bill's own\n// `GET /health/contract`. Comparing the two answers the only question that\n// matters after pinning an SDK version: does the deployment I am calling still\n// speak the contract I compiled against?\n//\n// `test/diagnose.test.ts` recomputes this from `src/generated` on every\n// `npm run check`, so a hand-edited contract cannot leave the constant stale.\nexport const CONTRACT_SHA256 = \"4efd4e4b669168c9cab5419fa04dd4e26a2029de2d4b10a59918e366189e1072\";\n","import { CONTRACT_SHA256 } from \"./contract-hash.js\";\n\n// Replaced at build time by tsup/vitest `define`.\ndeclare const __ORVELLO_SDK_VERSION__: string;\nconst SDK_VERSION: string = typeof __ORVELLO_SDK_VERSION__ === \"string\" ? __ORVELLO_SDK_VERSION__ : \"0.0.0-unbuilt\";\n\nexport type OrvelloContractStatus = \"match\" | \"drift\" | \"unknown\";\n\nexport type OrvelloDiagnosis = {\n ok: boolean;\n baseUrl: string | null;\n sdkVersion: string;\n reachable: boolean;\n contract: {\n status: OrvelloContractStatus;\n sdk: string;\n live: string | null;\n files: number | null;\n };\n problems: string[];\n checkedAt: string;\n};\n\nexport type BaseUrlProvider = string | (() => string | Promise<string>);\n\nexport type OrvelloDiagnoseOptions = {\n client?: { baseUrl: BaseUrlProvider };\n baseUrl?: BaseUrlProvider;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n signal?: AbortSignal;\n};\n\ntype ContractResponse = {\n service?: unknown;\n contractSha256?: unknown;\n files?: unknown;\n};\n\nfunction normalizeBaseUrl(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) throw new Error(\"Base URL cannot be empty\");\n return trimmed.replace(/\\/+$/, \"\");\n}\n\nasync function resolveBaseUrl(options: OrvelloDiagnoseOptions): Promise<string> {\n const provider = options.client?.baseUrl ?? options.baseUrl;\n if (!provider) {\n throw new Error(\n \"Diagnosing requires a target platform: pass { baseUrl } (the services checks its own \" +\n \"baseUrl) — the SDK ships no baked-in default endpoint.\"\n );\n }\n const value = typeof provider === \"function\" ? await provider() : provider;\n return normalizeBaseUrl(value);\n}\n\n/**\n * Ask a running orvello accounting/invoicing service which contract it speaks\n * and compare it to the one this SDK was built against.\n *\n * Read-only, unauthenticated, and cheap — designed for health-checks and AMP\n * connection-reconciliation (TSK-000084 / Kanten-Modell: connection_kind = 'invoicing').\n */\nexport async function diagnoseOrvello(options: OrvelloDiagnoseOptions = {}): Promise<OrvelloDiagnosis> {\n const checkedAt = new Date().toISOString();\n let baseUrl: string | null = null;\n try {\n baseUrl = await resolveBaseUrl(options);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n return {\n ok: false,\n baseUrl: null,\n sdkVersion: SDK_VERSION,\n reachable: false,\n contract: { status: \"unknown\", sdk: CONTRACT_SHA256, live: null, files: null },\n problems: [`Invalid base URL: ${detail}`],\n checkedAt,\n };\n }\n\n const doFetch = options.fetch ?? globalThis.fetch;\n const timeoutMs = options.timeoutMs ?? 5_000;\n\n const base: OrvelloDiagnosis = {\n ok: false,\n baseUrl,\n sdkVersion: SDK_VERSION,\n reachable: false,\n contract: { status: \"unknown\", sdk: CONTRACT_SHA256, live: null, files: null },\n problems: [],\n checkedAt,\n };\n\n if (typeof doFetch !== \"function\") {\n return { ...base, problems: [\"No fetch implementation available; pass `fetch` explicitly.\"] };\n }\n\n const controller = new AbortController();\n const onAbort = () => controller.abort(options.signal?.reason);\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted) controller.abort(options.signal.reason);\n const timer = setTimeout(() => controller.abort(new Error(`Contract probe timed out after ${timeoutMs}ms`)), timeoutMs);\n\n let response: Response;\n try {\n response = await doFetch(`${baseUrl}/health/contract`, {\n method: \"GET\",\n headers: { accept: \"application/json\" },\n signal: controller.signal,\n });\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n return { ...base, problems: [`the orvello service at ${baseUrl} could not be reached: ${detail}`] };\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n if (response.status === 404) {\n return {\n ...base,\n reachable: true,\n problems: [\n `the orvello service at ${baseUrl} does not serve GET /health/contract, so the contract cannot be verified.`,\n ],\n };\n }\n\n if (!response.ok) {\n return {\n ...base,\n reachable: true,\n problems: [`the orvello service at ${baseUrl} answered ${response.status} for GET /health/contract; contract not verified.`],\n };\n }\n\n let body: ContractResponse;\n try {\n body = (await response.json()) as ContractResponse;\n } catch {\n return { ...base, reachable: true, problems: [`the orvello service at ${baseUrl} returned a non-JSON contract fingerprint.`] };\n }\n\n const live = typeof body.contractSha256 === \"string\" && body.contractSha256 ? body.contractSha256 : null;\n const files = typeof body.files === \"number\" ? body.files : null;\n\n if (!live) {\n return {\n ...base,\n reachable: true,\n contract: { ...base.contract, files },\n problems: [`the orvello service at ${baseUrl} could not compute its own contract fingerprint; contract not verified.`],\n };\n }\n\n if (live !== CONTRACT_SHA256) {\n return {\n ...base,\n reachable: true,\n contract: { status: \"drift\", sdk: CONTRACT_SHA256, live, files },\n problems: [\n `Contract drift: the orvello service at ${baseUrl} speaks ${live.slice(0, 12)}, `\n + `@orvello/sdk ${SDK_VERSION} was built against ${CONTRACT_SHA256.slice(0, 12)}. `\n + \"Pin a newer SDK version, or deploy the orvello service the SDK was built from.\",\n ],\n };\n }\n\n return {\n ...base,\n ok: true,\n reachable: true,\n contract: { status: \"match\", sdk: CONTRACT_SHA256, live, files },\n };\n}\n","import type { ManagingCompaniesCurrentExternalResponseData } from \"./generated/api/features/routes.managing_companies_external.js\";\nimport type { PaymentAccount } from \"./generated/frontend-types.js\";\n\n/**\n * Receipt upload payload for expense creation (`createExpense`).\n * Transmitted as base64 in the JSON payload, supported natively by the orvello service.\n */\nexport interface ExpenseReceiptUpload {\n base64String: string;\n fileName: string;\n mimeType: string;\n size: number;\n}\n\n/**\n * Simplified bank account details for invoices, UI, and external payment references.\n */\nexport interface BankAccountDetails {\n id?: number;\n iban: string;\n bic: string;\n bank: string;\n accountHolder: string;\n currency?: string;\n isDefault?: boolean;\n}\n\n/**\n * Convert a binary buffer / Uint8Array into a structured `ExpenseReceiptUpload`\n * object for the `createExpense` endpoint. Works seamlessly in Node.js, Next.js, and browser runtimes.\n */\nexport function buildBase64Receipt(\n data: Uint8Array | ArrayBuffer | string,\n fileName: string,\n mimeType: string\n): ExpenseReceiptUpload {\n let base64String: string;\n let size: number;\n\n if (typeof data === \"string\") {\n // If already base64 or data URL\n base64String = data.startsWith(\"data:\") ? data.split(\",\")[1] || data : data;\n size = Math.round((base64String.length * 3) / 4);\n } else {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n size = bytes.byteLength;\n if (typeof Buffer !== \"undefined\") {\n base64String = Buffer.from(bytes).toString(\"base64\");\n } else {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i] ?? 0);\n }\n base64String = globalThis.btoa(binary);\n }\n }\n\n return {\n base64String,\n fileName,\n mimeType,\n size,\n };\n}\n\n/**\n * Check if the current managing company is subject to the German Kleinunternehmer regulation (§ 19 UStG).\n */\nexport function isKleinunternehmer(context: ManagingCompaniesCurrentExternalResponseData): boolean {\n return (\n context.taxation?.defaultVatTreatmentHint === \"KLEINUNTERNEHMER_0\" ||\n context.taxation?.regime?.toLowerCase() === \"kleinunternehmer\" ||\n context.taxation?.shouldShowVatOnInvoices === false\n );\n}\n\n/**\n * Calculate net, VAT, and gross amounts with standard 2-decimal financial rounding.\n */\nexport function calculateVat(\n netAmount: number | string,\n vatRatePercent: number\n): { net: string; vat: string; gross: string } {\n const netNum = typeof netAmount === \"string\" ? parseFloat(netAmount) : netAmount;\n if (isNaN(netNum)) {\n throw new Error(`Invalid net amount: \"${netAmount}\"`);\n }\n\n const vatNum = Math.round(netNum * vatRatePercent) / 100;\n const grossNum = Math.round((netNum + vatNum) * 100) / 100;\n\n return {\n net: netNum.toFixed(2),\n vat: vatNum.toFixed(2),\n gross: grossNum.toFixed(2),\n };\n}\n\n/**\n * Format a monetary amount (in EUR or specified currency) to localized German currency format.\n */\nexport function formatAmount(\n amount: number | string,\n currency = \"EUR\",\n locale = \"de-DE\"\n): string {\n const num = typeof amount === \"string\" ? parseFloat(amount) : amount;\n if (isNaN(num)) return String(amount);\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n }).format(num);\n}\n\n/**\n * Extract clean `BankAccountDetails` from an orvello `PaymentAccount`.\n */\nexport function mapPaymentAccountToBankDetails(account: PaymentAccount): BankAccountDetails {\n return {\n id: account.id,\n iban: account.iban || \"\",\n bic: account.bic || \"\",\n bank: account.bankName || \"\",\n accountHolder: account.accountOwner || \"\",\n currency: account.currency,\n isDefault: account.isDefault,\n };\n}\n","import type {\n InvoicesCreateExternalBody,\n InvoicesCreateExternalResponseData,\n InvoicesGetByIdExternalResponseData,\n InvoicesSearchExternalQuery,\n InvoicesSearchExternalResponseData,\n InvoicesPendingExternalResponseData,\n InvoicesOverdueExternalResponseData,\n InvoicesStatusPolicyExternalResponseData,\n InvoicesUpdateStatusExternalBody,\n InvoicesUpdateStatusExternalResponseData,\n InvoicesCreditNotePreviewExternalBody,\n InvoicesCreditNotePreviewExternalResponseData,\n InvoicesCreditNoteIssueExternalBody,\n InvoicesCreditNoteIssueExternalResponseData,\n InvoicesDeleteExternalResponseData,\n InvoicesSendEmailExternalBody,\n InvoicesSendEmailExternalResponseData,\n} from \"./generated/api/features/routes.invoices_external.js\";\n\nimport type {\n CustomerCompaniesSearchExternalQuery,\n CustomerCompaniesSearchExternalResponseData,\n CustomerCompaniesGetByIdExternalResponseData,\n CustomerCompaniesCreateExternalBody,\n CustomerCompaniesCreateExternalResponseData,\n CustomerCompaniesUpdateExternalBody,\n CustomerCompaniesUpdateExternalResponseData,\n CustomerCompaniesDeleteExternalResponseData,\n} from \"./generated/api/features/routes.customer_companies_external.js\";\n\nimport type {\n ManagingCompaniesCurrentExternalResponseData,\n} from \"./generated/api/features/routes.managing_companies_external.js\";\n\nimport type {\n DunningSuggestionsExternalQuery,\n DunningSuggestionsExternalResponseData,\n DunningPreviewExternalBody,\n DunningPreviewExternalResponseData,\n DunningIssueExternalBody,\n DunningIssueExternalResponseData,\n DunningGetSettingsExternalResponseData,\n DunningUpdateSettingsExternalBody,\n DunningUpdateSettingsExternalResponseData,\n} from \"./generated/api/features/routes.dunning_external.js\";\n\nimport type {\n BookkeepingRevenuesCreateExternalBody,\n BookkeepingRevenuesCreateExternalResponseData,\n BookkeepingRevenuesInvoiceAdjustmentExternalBody,\n BookkeepingRevenuesInvoiceAdjustmentExternalResponseData,\n BookkeepingExpensesCreateExternalBody,\n BookkeepingExpensesCreateExternalResponseData,\n BookkeepingPaymentsListAccountsExternalQuery,\n BookkeepingPaymentsListAccountsExternalResponseData,\n BookkeepingPaymentsCreateManualExternalBody,\n BookkeepingPaymentsCreateManualExternalResponseData,\n BookkeepingPaymentsSettleInvoiceExternalBody,\n BookkeepingPaymentsSettleInvoiceExternalResponseData,\n} from \"./generated/api/features/routes.bookkeeping.js\";\n\nimport type {\n UsersGetByExternalUserIdResponseData,\n UsersUpdateExternalBody,\n UsersUpdateExternalResponseData,\n UsersDeleteExternalResponseData,\n} from \"./generated/api/base/routes.users.js\";\n\nimport type {\n Oauth2ExternalClientsListQuery,\n Oauth2ExternalClientsListResponseData,\n Oauth2ExternalClientsGetResponseData,\n Oauth2ExternalClientsCreateBody,\n Oauth2ExternalClientsCreateResponseData,\n Oauth2ExternalClientsUpdateBody,\n Oauth2ExternalClientsUpdateResponseData,\n Oauth2ExternalClientsRotateBody,\n Oauth2ExternalClientsRotateResponseData,\n Oauth2ExternalClientsRetireResponseData,\n Oauth2ExternalClientsRollbackResponseData,\n Oauth2ExternalClientsRevokeResponseData,\n Oauth2ExternalClientsDeleteResponseData,\n} from \"./generated/api/features/routes.oauth2_external.js\";\n\nimport { type BaseUrlProvider } from \"./diagnose.js\";\nimport {\n type ExpenseReceiptUpload,\n type BankAccountDetails,\n mapPaymentAccountToBankDetails,\n} from \"./helpers.js\";\n\nexport type AuthProvider =\n | string\n | (() => string | Promise<string>)\n | {\n apiKey: string;\n }\n | {\n clientId: string;\n clientSecret: string;\n scope?: string;\n tokenUrl?: string;\n };\n\nexport interface OrvelloClientConfig {\n /**\n * Base URL of the orvello accounting/invoicing service this client talks to.\n *\n * The SDK deliberately ships **no** baked-in default endpoint: every instance\n * resolves its target platform explicitly. Pass `baseUrl`, or the same value\n * via the `ORVELLO_URL` environment variable. Without either the constructor\n * throws rather than silently aiming at a fixed host.\n */\n baseUrl?: BaseUrlProvider;\n auth?: AuthProvider;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n maxRetries?: number;\n retryBaseDelayMs?: number;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown>;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n rawResponse?: boolean;\n timeoutMs?: number;\n maxRetries?: number;\n signal?: AbortSignal;\n}\n\nexport class OrvelloApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly endpoint: string,\n public readonly body: unknown,\n message?: string\n ) {\n super(message || `orvello request to ${endpoint} failed with status ${status}: ${statusText}`);\n this.name = \"OrvelloApiError\";\n }\n\n /** Readable alias for the primary `status` field. */\n public get statusCode(): number {\n return this.status;\n }\n\n /** Readable alias for the raw `body` payload. */\n public get responseBody(): unknown {\n return this.body;\n }\n}\n\nexport class OrvelloClient {\n public readonly baseUrl: BaseUrlProvider;\n private readonly auth?: AuthProvider;\n private readonly doFetch: typeof globalThis.fetch;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly retryBaseDelayMs: number;\n private cachedOAuthToken: { token: string; expiresAt: number } | null = null;\n\n // Cached default bank account (5 minutes TTL)\n private _bankAccountCache: BankAccountDetails | null = null;\n private _bankAccountCacheTime = 0;\n\n constructor(config: OrvelloClientConfig = {}) {\n const baseUrl = config.baseUrl ?? this.envBaseUrl();\n if (!baseUrl) {\n throw new Error(\n \"OrvelloClient requires a target platform: pass { baseUrl } or set the ORVELLO_URL \" +\n \"environment variable. The SDK deliberately ships no baked-in default endpoint.\"\n );\n }\n this.baseUrl = baseUrl;\n\n if (config.auth) {\n this.auth = config.auth;\n } else {\n this.auth = this.envAuth();\n }\n\n this.doFetch = config.fetch || globalThis.fetch;\n this.timeoutMs = config.timeoutMs ?? 15_000;\n this.maxRetries = config.maxRetries ?? 3;\n this.retryBaseDelayMs = config.retryBaseDelayMs ?? 500;\n }\n\n private envBaseUrl(): BaseUrlProvider | undefined {\n if (typeof process === \"undefined\" || !process?.env) return undefined;\n const url = process.env.ORVELLO_URL;\n return url ? url : undefined;\n }\n\n private envAuth(): AuthProvider | undefined {\n if (typeof process === \"undefined\" || !process?.env) return undefined;\n const clientId = process.env.ORVELLO_OAUTH_CLIENT_ID;\n const clientSecret = process.env.ORVELLO_OAUTH_CLIENT_SECRET;\n const apiKey = process.env.ORVELLO_API_KEY;\n const scope = process.env.ORVELLO_OAUTH_SCOPE;\n\n if (clientId && clientSecret && clientId !== \"todo\" && clientSecret !== \"todo\") {\n return { clientId, clientSecret, ...(scope ? { scope } : {}) };\n }\n if (apiKey) return { apiKey };\n return undefined;\n }\n\n public async resolveBaseUrl(): Promise<string> {\n const val = typeof this.baseUrl === \"function\" ? await this.baseUrl() : this.baseUrl;\n return val.replace(/\\/+$/, \"\");\n }\n\n private async getAuthHeader(): Promise<string | null> {\n if (!this.auth) return null;\n\n if (typeof this.auth === \"string\") {\n return this.auth.startsWith(\"Bearer \") ? this.auth : `Bearer ${this.auth}`;\n }\n\n if (typeof this.auth === \"function\") {\n const token = await this.auth();\n return token.startsWith(\"Bearer \") ? token : `Bearer ${token}`;\n }\n\n if (typeof this.auth === \"object\" && \"apiKey\" in this.auth && typeof this.auth.apiKey === \"string\") {\n const key = this.auth.apiKey;\n return key.startsWith(\"Bearer \") ? key : `Bearer ${key}`;\n }\n\n // OAuth2 client_credentials flow\n if (\n typeof this.auth === \"object\" &&\n \"clientId\" in this.auth &&\n \"clientSecret\" in this.auth\n ) {\n const now = Date.now();\n if (this.cachedOAuthToken && this.cachedOAuthToken.expiresAt > now + 30_000) {\n return `Bearer ${this.cachedOAuthToken.token}`;\n }\n\n const baseUrl = await this.resolveBaseUrl();\n const tokenEndpoint = this.auth.tokenUrl || `${baseUrl}/oauth/token`;\n const credentials = typeof Buffer !== \"undefined\"\n ? Buffer.from(`${this.auth.clientId}:${this.auth.clientSecret}`).toString(\"base64\")\n : globalThis.btoa(`${this.auth.clientId}:${this.auth.clientSecret}`);\n\n const bodyParams = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.auth.clientId,\n client_secret: this.auth.clientSecret,\n });\n if (this.auth.scope) {\n bodyParams.set(\"scope\", this.auth.scope);\n }\n\n const resp = await this.doFetch(tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Authorization\": `Basic ${credentials}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: bodyParams.toString(),\n });\n\n if (!resp.ok) {\n let errBody: unknown;\n try {\n errBody = await resp.json();\n } catch {\n errBody = await resp.text().catch(() => \"\");\n }\n throw new OrvelloApiError(\n resp.status,\n resp.statusText,\n tokenEndpoint,\n errBody,\n \"Failed to obtain OAuth2 token from the orvello service\" );\n }\n\n const data = (await resp.json()) as { access_token: string; expires_in?: number };\n const expiresIn = data.expires_in || 3600;\n this.cachedOAuthToken = {\n token: data.access_token,\n expiresAt: now + expiresIn * 1000,\n };\n\n return `Bearer ${data.access_token}`;\n }\n\n return null;\n }\n\n private isRetriable(status: number | null, error: unknown): boolean {\n if (status !== null) {\n // 5xx = server error, 429 = rate limit\n return status >= 500 || status === 429;\n }\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n return (\n error.name === \"AbortError\" ||\n error.name === \"TimeoutError\" ||\n msg.includes(\"fetch failed\") ||\n msg.includes(\"network\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"etimedout\") ||\n msg.includes(\"enotfound\") ||\n msg.includes(\"socket\")\n );\n }\n return false;\n }\n\n public async request<T = unknown>(\n path: string,\n options: RequestInit & RequestOptions = {}\n ): Promise<T> {\n const maxRetries = options.maxRetries ?? this.maxRetries;\n const timeoutMs = options.timeoutMs ?? this.timeoutMs;\n const baseUrl = await this.resolveBaseUrl();\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n const url = new URL(`${baseUrl}${cleanPath}`);\n\n if (options.query) {\n for (const [k, v] of Object.entries(options.query)) {\n if (v !== undefined && v !== null) {\n url.searchParams.set(k, String(v));\n }\n }\n }\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const onAbort = () => controller.abort(options.signal?.reason);\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted) controller.abort(options.signal.reason);\n\n const timer = setTimeout(\n () => controller.abort(new Error(`Request timed out after ${timeoutMs}ms`)),\n timeoutMs\n );\n\n try {\n const authHeader = await this.getAuthHeader();\n const headers = new Headers(options.headers);\n\n if (!headers.has(\"Accept\")) {\n headers.set(\"Accept\", options.rawResponse ? \"*/*\" : \"application/json\");\n }\n if (authHeader && !headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", authHeader);\n }\n if (options.idempotencyKey && !headers.has(\"Idempotency-Key\")) {\n headers.set(\"Idempotency-Key\", options.idempotencyKey);\n }\n if (options.body && typeof options.body === \"string\" && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const resp = await this.doFetch(url.toString(), {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n if (!resp.ok) {\n if (resp.status === 401) {\n const hadCachedToken = Boolean(this.cachedOAuthToken);\n this.cachedOAuthToken = null;\n // If we used a cached token and it was rejected with 401, retry once with fresh token\n if (hadCachedToken && attempt === 0 && attempt < maxRetries) {\n continue;\n }\n }\n\n let errBody: unknown;\n try {\n errBody = await resp.json();\n } catch {\n errBody = await resp.text().catch(() => null);\n }\n\n const apiMessage =\n errBody && typeof errBody === \"object\" && \"message\" in errBody && typeof (errBody as { message: unknown }).message === \"string\"\n ? (errBody as { message: string }).message\n : undefined;\n\n const error = new OrvelloApiError(resp.status, resp.statusText, cleanPath, errBody, apiMessage);\n\n if (!this.isRetriable(resp.status, error) || attempt >= maxRetries) {\n throw error;\n }\n lastError = error;\n } else {\n // Success response\n const contentType = resp.headers.get(\"content-type\") || \"\";\n\n if (options.rawResponse || contentType.includes(\"application/pdf\")) {\n return (await resp.blob()) as unknown as T;\n }\n\n if (contentType.includes(\"application/json\")) {\n const json = await resp.json();\n\n // Check if response is wrapped in ApiEnvelope ({ success, data, message })\n if (json && typeof json === \"object\" && \"success\" in json) {\n const env = json as { success: boolean; data?: unknown; message?: string };\n if (env.success === false) {\n throw new OrvelloApiError(resp.status, resp.statusText, cleanPath, json, env.message || \"API returned success=false\");\n }\n return env.data as T;\n }\n\n return json as T;\n }\n\n return (await resp.text()) as unknown as T;\n }\n } catch (err) {\n lastError = err;\n if (err instanceof OrvelloApiError && !this.isRetriable(err.status, err)) {\n throw err;\n }\n if (!this.isRetriable(null, err) || attempt >= maxRetries) {\n throw err;\n }\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n // Retry backoff delay: base * 2^attempt + jitter\n const jitter = Math.random() * 100;\n const delay = this.retryBaseDelayMs * Math.pow(2, attempt) + jitter;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n throw lastError;\n }\n\n // ── Invoices ─────────────────────────────────────────────────────────────\n public invoices = {\n search: (query?: InvoicesSearchExternalQuery, options?: RequestOptions) =>\n this.request<InvoicesSearchExternalResponseData>(\"/invoices/external\", {\n method: \"GET\",\n query: query as Record<string, unknown>,\n ...options,\n }),\n\n getById: (id: number, options?: RequestOptions) =>\n this.request<InvoicesGetByIdExternalResponseData>(`/invoices/external/${id}`, {\n method: \"GET\",\n ...options,\n }),\n\n getPending: (options?: RequestOptions) =>\n this.request<InvoicesPendingExternalResponseData>(\"/invoices/external/pending\", {\n method: \"GET\",\n ...options,\n }),\n\n getOverdue: (options?: RequestOptions) =>\n this.request<InvoicesOverdueExternalResponseData>(\"/invoices/external/overdue\", {\n method: \"GET\",\n ...options,\n }),\n\n getStatusPolicy: (id: number, options?: RequestOptions) =>\n this.request<InvoicesStatusPolicyExternalResponseData>(`/invoices/external/${id}/status-policy`, {\n method: \"GET\",\n ...options,\n }),\n\n create: (body: InvoicesCreateExternalBody, options?: RequestOptions) =>\n this.request<InvoicesCreateExternalResponseData>(\"/invoices/external\", {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n updateStatus: (id: number, body: InvoicesUpdateStatusExternalBody, options?: RequestOptions) =>\n this.request<InvoicesUpdateStatusExternalResponseData>(`/invoices/external/${id}/status`, {\n method: \"PUT\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n previewCreditNote: (id: number, body: InvoicesCreditNotePreviewExternalBody, options?: RequestOptions) =>\n this.request<InvoicesCreditNotePreviewExternalResponseData>(`/invoices/external/${id}/credit-note/preview`, {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n issueCreditNote: (id: number, body: InvoicesCreditNoteIssueExternalBody, options?: RequestOptions) =>\n this.request<InvoicesCreditNoteIssueExternalResponseData>(`/invoices/external/${id}/credit-note/issue`, {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n delete: (id: number, options?: RequestOptions) =>\n this.request<InvoicesDeleteExternalResponseData>(`/invoices/external/${id}`, {\n method: \"DELETE\",\n ...options,\n }),\n\n viewPdf: (id: number, options?: RequestOptions) =>\n this.request<Blob>(`/invoices/external/${id}/pdf`, {\n method: \"GET\",\n rawResponse: true,\n ...options,\n }),\n\n downloadPdf: (id: number, options?: RequestOptions) =>\n this.request<Blob>(`/invoices/external/${id}/download`, {\n method: \"GET\",\n rawResponse: true,\n ...options,\n }),\n\n sendEmail: (id: number, body: InvoicesSendEmailExternalBody, options?: RequestOptions) =>\n this.request<InvoicesSendEmailExternalResponseData>(`/invoices/external/${id}/send-email`, {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n downloadPdfFromUrl: async (pdfUrl: string, options?: RequestOptions): Promise<Blob> => {\n const baseUrl = await this.resolveBaseUrl();\n const targetUrl = pdfUrl.startsWith(\"http://\") || pdfUrl.startsWith(\"https://\")\n ? pdfUrl\n : `${baseUrl}${pdfUrl.startsWith(\"/\") ? \"\" : \"/\"}${pdfUrl}`;\n\n const doFetch = this.doFetch;\n const authHeader = await this.getAuthHeader();\n const headers = new Headers(options?.headers);\n if (authHeader && !headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", authHeader);\n }\n\n const resp = await doFetch(targetUrl, {\n method: \"GET\",\n headers,\n signal: options?.signal,\n });\n\n if (!resp.ok) {\n throw new OrvelloApiError(resp.status, resp.statusText, targetUrl, null, `Failed to download PDF from ${targetUrl}`);\n }\n return await resp.blob();\n },\n };\n\n // ── Customer Companies ───────────────────────────────────────────────────\n public customerCompanies = {\n search: (query?: CustomerCompaniesSearchExternalQuery, options?: RequestOptions) =>\n this.request<CustomerCompaniesSearchExternalResponseData>(\"/customer-companies/external\", {\n method: \"GET\",\n query: query as Record<string, unknown>,\n ...options,\n }),\n\n getById: (id: number, options?: RequestOptions) =>\n this.request<CustomerCompaniesGetByIdExternalResponseData>(`/customer-companies/external/${id}`, {\n method: \"GET\",\n ...options,\n }),\n\n create: (body: CustomerCompaniesCreateExternalBody, options?: RequestOptions) =>\n this.request<CustomerCompaniesCreateExternalResponseData>(\"/customer-companies/external\", {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n update: (id: number, body: CustomerCompaniesUpdateExternalBody, options?: RequestOptions) =>\n this.request<CustomerCompaniesUpdateExternalResponseData>(`/customer-companies/external/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n delete: (id: number, options?: RequestOptions) =>\n this.request<CustomerCompaniesDeleteExternalResponseData>(`/customer-companies/external/${id}`, {\n method: \"DELETE\",\n ...options,\n }),\n };\n\n // ── Managing Companies ───────────────────────────────────────────────────\n public managingCompanies = {\n getCurrent: (options?: RequestOptions) =>\n this.request<ManagingCompaniesCurrentExternalResponseData>(\"/managing-companies/external/current\", {\n method: \"GET\",\n ...options,\n }),\n };\n\n // ── Dunning ──────────────────────────────────────────────────────────────\n public dunning = {\n suggestions: (query?: DunningSuggestionsExternalQuery, options?: RequestOptions) =>\n this.request<DunningSuggestionsExternalResponseData>(\"/invoices/external/dunning/suggestions\", {\n method: \"GET\",\n query: query as Record<string, unknown>,\n ...options,\n }),\n\n preview: (invoiceId: number, body?: DunningPreviewExternalBody, options?: RequestOptions) =>\n this.request<DunningPreviewExternalResponseData>(`/invoices/external/dunning/${invoiceId}/preview`, {\n method: \"POST\",\n body: body ? JSON.stringify(body) : undefined,\n ...options,\n }),\n\n issue: (invoiceId: number, body: DunningIssueExternalBody, options?: RequestOptions) =>\n this.request<DunningIssueExternalResponseData>(`/invoices/external/dunning/${invoiceId}/issue`, {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n getNoticePdf: (noticeId: number, options?: RequestOptions) =>\n this.request<Blob>(`/invoices/external/dunning/notices/${noticeId}/pdf`, {\n method: \"GET\",\n rawResponse: true,\n ...options,\n }),\n\n downloadNoticePdf: (noticeId: number, options?: RequestOptions) =>\n this.request<Blob>(`/invoices/external/dunning/notices/${noticeId}/download`, {\n method: \"GET\",\n rawResponse: true,\n ...options,\n }),\n\n getSettings: (options?: RequestOptions) =>\n this.request<DunningGetSettingsExternalResponseData>(\"/invoices/external/dunning/settings\", {\n method: \"GET\",\n ...options,\n }),\n\n updateSettings: (body: DunningUpdateSettingsExternalBody, options?: RequestOptions) =>\n this.request<DunningUpdateSettingsExternalResponseData>(\"/invoices/external/dunning/settings\", {\n method: \"PUT\",\n body: JSON.stringify(body),\n ...options,\n }),\n };\n\n // ── Bookkeeping ──────────────────────────────────────────────────────────\n public bookkeeping = {\n revenues: {\n create: (body: BookkeepingRevenuesCreateExternalBody, options?: RequestOptions) => {\n const idempotencyKey = options?.idempotencyKey || (body as { externalRef?: string }).externalRef;\n return this.request<BookkeepingRevenuesCreateExternalResponseData>(\"/bookkeeping/revenues/external\", {\n method: \"POST\",\n body: JSON.stringify(body),\n idempotencyKey,\n ...options,\n });\n },\n\n createInvoiceAdjustment: (\n body: BookkeepingRevenuesInvoiceAdjustmentExternalBody,\n options?: RequestOptions\n ) => {\n const idempotencyKey = options?.idempotencyKey || body.externalRef;\n return this.request<BookkeepingRevenuesInvoiceAdjustmentExternalResponseData>(\n \"/bookkeeping/revenues/external/invoice-adjustment\",\n {\n method: \"POST\",\n body: JSON.stringify(body),\n idempotencyKey,\n ...options,\n }\n );\n },\n },\n\n expenses: {\n create: (\n body: BookkeepingExpensesCreateExternalBody,\n options?: RequestOptions & { receipt?: ExpenseReceiptUpload }\n ) => {\n const { receipt, ...reqOpts } = options || {};\n const payload = receipt ? { ...body, ...receipt } : body;\n const idempotencyKey = reqOpts.idempotencyKey || (body as { externalRef?: string }).externalRef;\n\n return this.request<BookkeepingExpensesCreateExternalResponseData>(\"/bookkeeping/expenses/external\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n idempotencyKey,\n ...reqOpts,\n });\n },\n },\n\n payments: {\n listAccounts: (options?: BookkeepingPaymentsListAccountsExternalQuery, reqOptions?: RequestOptions) =>\n this.request<BookkeepingPaymentsListAccountsExternalResponseData>(\"/bookkeeping/payments/external/accounts\", {\n method: \"GET\",\n query: options as Record<string, unknown>,\n ...reqOptions,\n }),\n\n createManual: (body: BookkeepingPaymentsCreateManualExternalBody, options?: RequestOptions) => {\n const idempotencyKey = options?.idempotencyKey || body.externalRef;\n return this.request<BookkeepingPaymentsCreateManualExternalResponseData>(\n \"/bookkeeping/payments/external/manual\",\n {\n method: \"POST\",\n body: JSON.stringify(body),\n idempotencyKey,\n ...options,\n }\n );\n },\n\n settleInvoice: (body: BookkeepingPaymentsSettleInvoiceExternalBody, options?: RequestOptions) => {\n const idempotencyKey =\n options?.idempotencyKey ||\n body.externalRef ||\n `settle-${body.invoiceId}-${Date.now()}`;\n\n return this.request<BookkeepingPaymentsSettleInvoiceExternalResponseData>(\n \"/bookkeeping/payments/external/settle-invoice\",\n {\n method: \"POST\",\n body: JSON.stringify(body),\n idempotencyKey,\n ...options,\n }\n );\n },\n },\n\n getDefaultBankAccount: async (options?: { forceRefresh?: boolean }): Promise<BankAccountDetails> => {\n const now = Date.now();\n if (\n !options?.forceRefresh &&\n this._bankAccountCache &&\n now - this._bankAccountCacheTime < 5 * 60 * 1000\n ) {\n return this._bankAccountCache;\n }\n\n const accounts = await this.bookkeeping.payments.listAccounts({ includeArchived: false });\n const bankAccounts = (accounts || []).filter((a) => a.type === \"bank\" && !a.isArchived);\n\n // Primary: isDefault bank account\n let target = bankAccounts.find((a) => a.isDefault);\n\n // Fallback: if exactly one active bank account exists, use it\n if (!target && bankAccounts.length === 1) {\n target = bankAccounts[0];\n }\n\n if (!target) {\n throw new Error(\n \"Kein Default-Bankkonto im orvello-Dienst gefunden. Bitte dort ein Bankkonto als Standard markieren.\"\n );\n }\n\n const result = mapPaymentAccountToBankDetails(target);\n this._bankAccountCache = result;\n this._bankAccountCacheTime = now;\n return result;\n },\n };\n\n // ── Users ────────────────────────────────────────────────────────────────\n public users = {\n getByExternalUserId: (externalUserId: string, options?: RequestOptions) =>\n this.request<UsersGetByExternalUserIdResponseData>(`/users/getByExternalUserId/${encodeURIComponent(externalUserId)}`, {\n method: \"GET\",\n ...options,\n }),\n\n update: (frontendUserId: number, body: UsersUpdateExternalBody, options?: RequestOptions) =>\n this.request<UsersUpdateExternalResponseData>(`/users/update/external/${frontendUserId}`, {\n method: \"PUT\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n delete: (frontendUserId: number, options?: RequestOptions) =>\n this.request<UsersDeleteExternalResponseData>(`/users/delete/external/${frontendUserId}`, {\n method: \"DELETE\",\n ...options,\n }),\n };\n\n // ── OAuth2 External Clients (Connection Manager) ─────────────────────────\n public oauthClients = {\n list: (query?: Oauth2ExternalClientsListQuery, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsListResponseData>(\"/oauth/clients/external/list\", {\n method: \"GET\",\n query: query as Record<string, unknown>,\n ...options,\n }),\n\n get: (idOrClientId: string, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsGetResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}`, {\n method: \"GET\",\n ...options,\n }),\n\n create: (body: Oauth2ExternalClientsCreateBody, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsCreateResponseData>(\"/oauth/clients/external\", {\n method: \"POST\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n update: (idOrClientId: string, body: Oauth2ExternalClientsUpdateBody, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsUpdateResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}`, {\n method: \"PUT\",\n body: JSON.stringify(body),\n ...options,\n }),\n\n delete: (idOrClientId: string, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsDeleteResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}`, {\n method: \"DELETE\",\n ...options,\n }),\n\n rotate: (idOrClientId: string, body?: Oauth2ExternalClientsRotateBody, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsRotateResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}/rotate`, {\n method: \"POST\",\n body: body ? JSON.stringify(body) : undefined,\n ...options,\n }),\n\n retire: (idOrClientId: string, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsRetireResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}/retire`, {\n method: \"POST\",\n ...options,\n }),\n\n rollback: (idOrClientId: string, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsRollbackResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}/rollback`, {\n method: \"POST\",\n ...options,\n }),\n\n revoke: (idOrClientId: string, options?: RequestOptions) =>\n this.request<Oauth2ExternalClientsRevokeResponseData>(`/oauth/clients/external/${encodeURIComponent(idOrClientId)}/revoke`, {\n method: \"POST\",\n ...options,\n }),\n };\n}\n\nexport function createOrvelloClient(config?: OrvelloClientConfig): OrvelloClient {\n return new OrvelloClient(config);\n}\n"]}
|