{"version":3,"file":"js/ab598fafe4f535b49feb.chunk.js","mappings":"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","sources":["webpack:///./features/accounting-software/api/helpers.ts","webpack:///./features/accounting-software/utils/getAccountingSoftwareName.ts","webpack:///./features/accounting-software/types/AccountingSoftwareBillStatus.ts","webpack:///./features/accounting-software/services/companyAccountingSoftware.ts","webpack:///./features/accounting-software/types/AccountingSoftware.ts","webpack:///./features/accounting-software/types/SyncType.ts","webpack:///./features/accounting-software/types/reconciliationSettings.ts","webpack:///./legacy/features/companies/documents/services/document.ts","webpack:///./legacy/features/companies/documents/services/documentError.ts"],"sourcesContent":["import { API_PREFIX } from './constants';\n\n/**\n * Returns an API URL for accounting software endpoints\n * @param companyId Company ID\n * @param endpoint Accounting software endpoint\n * @param query Query string parameters\n * @returns API URL\n * @throws Error if `companyId` or `endpoint` is not provided\n * @example\n * ```\n * apiUrl('companyId', 'endpoint');\n * // => 'https://api.plooto.com/v1/companies/companyId/accountingSoftware/endpoint'\n * ```\n */\nconst apiUrl = (companyId: string, endpoint?: string, query?: Record): string => {\n const cleanEndpoint = endpoint ? `/${endpoint.replace(/^\\//, '')}` : '';\n const url = new URL(\n `${import.meta.env.APP_URLS_API_URL}/${API_PREFIX}` +\n `/companies/${companyId}/accountingSoftware${cleanEndpoint}`\n );\n\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n url.searchParams.set(key, value);\n });\n }\n\n return url.toString();\n};\n\nexport { apiUrl };\n","import { Instance as companyAccountingSoftwareService } from '../services/companyAccountingSoftware';\n\n/**\n * Get name of accounting software package for the current company.\n */\nexport function getAccountingSoftwareName(): string {\n const accountingSoftware = companyAccountingSoftwareService.softwarePackage;\n return accountingSoftware?.name ?? '';\n}\n","enum AccountingSoftwareBillStatus {\n Unknown = 'Unknown',\n /** This is the first step at marking the bill for payment */\n PayBill = 'PayBill',\n /** Wait until we have a payment that's scheduled so we can proceed with other reconcilation parts */\n WaitForScheduledPayment = 'WaitForScheduledPayment',\n TransferFromClearingToBank = 'TransferFromClearingToBank',\n TransferFeeFromClearing = 'TransferFeeFromClearing',\n ForexTransferBetweenPlootoClearing = 'ForexTransferBetweenPlootoClearing',\n Completed = 'Completed',\n Deleted = 'Deleted',\n Error = 'Error',\n UnreconciliationCompleted = 'UnreconciliationCompleted',\n ManuallyReconciled = 'ManuallyReconciled',\n ManuallyUnreconciled = 'ManuallyUnreconciled',\n UpdateFxRate = 'UpdateFxRate',\n PendingUnreconciliation = 'PendingUnreconciliation',\n}\n\nexport default AccountingSoftwareBillStatus;\n","import * as ko from 'knockout';\nimport $ from 'jquery';\nimport { isNil } from 'lodash-es';\n\nimport { SUPPORTED_ACCOUNTING_CURRENCIES } from '@/config/env';\nimport { CodatDataType } from '@/features/accounting-software/types/CodatSync';\nimport { ApiService } from '@/features/api';\nimport { AccountingSoftwareIntegrationEventsServiceEventType } from '@/legacy/features/companies/accountingSoftware/analytics/helper';\nimport { Instance as companyService, PermissionId } from '@/legacy/services/company';\nimport CompanyEventService from '@/legacy/services/companyEventService';\nimport * as viewModels from '@/legacy/viewmodels/viewModels';\n\nimport { apiUrl } from '../api/helpers';\nimport AccountingSoftwareBillAttachmentDetails from '../types/AccountingSoftwareBillAttachmentDetails';\nimport AccountingSoftwareBillViewModel from '../types/AccountingSoftwareBillViewModel';\nimport AttachmentDetails from '../types/AttachmentDetails';\nimport Bill from '../types/Bill';\nimport FileAttachment from '../types/FileAttachment';\nimport Invoice from '../types/Invoice';\nimport { SupportedAccountingSoftware } from '../types/SupportedAccountingSoftware';\nimport { SyncState } from '../types/SyncState';\nimport SyncType from '../types/SyncType';\n\nimport { Instance as accountingSoftwareService } from './accountingSoftware';\n\ntype ResyncOptions = {\n /** @default SyncType.Auto */\n syncType?: SyncType;\n /** @default [] */\n syncDataTypes?: ReadonlyArray;\n};\n\nexport class CompanyAccountingSoftwareService {\n private companyService = companyService;\n\n private accountingSoftwareService = accountingSoftwareService;\n\n public static billsLoadingError = ko.observable('');\n\n public static newBills = ko.observableArray();\n\n public static invoicesLoadingError = ko.observable('');\n\n public static newInvoices = ko.observableArray();\n\n /**\n * Sync status of the company accounting software\n *\n * WARNING: Sets state to idle when the sync is complete and adds special error states\n * @deprecated use `syncState` instead\n */\n public syncStatus = ko.observable('idle');\n\n /**\n * Sync state of the company accounting software\n */\n public dataTypeSyncState = ko.observable>(\n new Map(Object.values(CodatDataType).map((dataType) => [dataType, 'idle']))\n );\n\n public dataTypeLastSyncedAt = ko.observable>(new Map());\n\n public HasUnsupportedBills = ko.observable(false);\n\n public HasUnsupportedInvoices = ko.observable(false);\n\n private get companyId(): string {\n return this.companyService.CompanyId();\n }\n\n /** Accounting software package type observable for current company */\n public softwareTypeObservable = ko.pureComputed({\n read: () => {\n const companyMembership = this.companyService.membership();\n if (companyMembership === undefined || !ko.isObservable(companyMembership.company)) {\n return undefined;\n }\n const retVal = companyMembership.company().accountingSoftware();\n return retVal;\n },\n deferEvaluation: true,\n });\n\n /** Accounting software package observable for current company */\n public softwarePackageObservable = ko.pureComputed({\n read: () => {\n const id = this.softwareTypeObservable();\n return id ? this.accountingSoftwareService.GetPackage(id) : undefined;\n },\n deferEvaluation: true,\n });\n\n /** Accounting software package for current company */\n public get softwarePackage() {\n return this.softwarePackageObservable();\n }\n\n /** Check if company has accounting software connected and configured */\n public hasSoftwareConnected: KnockoutComputed = ko.pureComputed({\n read: () => !isNil(this.softwarePackageObservable()),\n deferEvaluation: true,\n });\n\n private updateLastSyncedAt(dataTypes: ReadonlyArray, when: Date | undefined) {\n const next = new Map(this.dataTypeLastSyncedAt());\n dataTypes.forEach((dataType) => {\n next.set(dataType, when);\n });\n this.dataTypeLastSyncedAt(next);\n }\n\n private updateSyncState(dataTypes: ReadonlyArray, state: SyncState) {\n const next = new Map(this.dataTypeSyncState());\n dataTypes.forEach((dataType) => {\n next.set(dataType, state);\n });\n this.dataTypeSyncState(next);\n }\n\n /**\n * Resync company accounting software, along with bills and invoices (by default),\n * if allowed by current user permissions\n * @param options {@link ResyncOptions}\n * @returns Promise that resolves when the sync is complete\n */\n public resync({ syncType = SyncType.Auto, syncDataTypes = [] }: ResyncOptions) {\n if (!this.hasSoftwareConnected()) {\n return undefined;\n }\n\n const filteredDataTypes = syncDataTypes.filter((dataType) => {\n if (dataType === CodatDataType.Bills || dataType === CodatDataType.Invoices) {\n return this.companyService.HasPermissionTo(PermissionId.PAYMENT_ADD_EDIT);\n }\n return true;\n });\n\n if (filteredDataTypes.length <= 0) {\n return Promise.resolve();\n }\n\n filteredDataTypes.forEach((dataType) => {\n switch (dataType) {\n case CodatDataType.Bills:\n this.clearBills();\n break;\n case CodatDataType.Invoices:\n this.clearInvoices();\n break;\n default:\n break;\n }\n });\n\n this.syncStatus('syncing');\n this.updateSyncState(syncDataTypes, 'syncing');\n\n // See `if (!this.hasSoftwareConnected())` above.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.softwarePackage!.SyncData(syncType, filteredDataTypes)\n .then(() =>\n Promise.all(\n filteredDataTypes.map((dataType) => {\n switch (dataType) {\n case CodatDataType.Bills:\n return this.UpdateBills();\n case CodatDataType.Invoices:\n return this.UpdateInvoices();\n default:\n return null;\n }\n })\n )\n )\n .then(() => {\n const state = 'connected';\n\n this.syncStatus('idle');\n this.updateSyncState(syncDataTypes, state);\n this.fireAccountingSoftwareSyncEvent(state);\n this.updateLastSyncedAt(syncDataTypes, new Date());\n })\n .catch((errorInfo) => {\n const state = 'error';\n\n this.syncStatus(state);\n this.updateSyncState(syncDataTypes, state);\n this.fireAccountingSoftwareSyncEvent(\n errorInfo?.type === 'expired.oauth' ? 'expired' : state\n );\n\n this.clearSelectedPayments();\n\n if (\n errorInfo &&\n (errorInfo.type === 'expired.oauth' || errorInfo.type === 'error.tooManyRequests')\n ) {\n this.syncStatus(errorInfo.type);\n }\n });\n }\n\n public RefreshInvoices() {\n if (!this.hasSoftwareConnected()) {\n return undefined;\n }\n\n return this.UpdateInvoices();\n }\n\n public RefreshBills() {\n if (!this.hasSoftwareConnected()) {\n return undefined;\n }\n\n return this.UpdateBills();\n }\n\n /** Disconnect company from accounting software */\n public async disconnect(): Promise {\n if (!this.hasSoftwareConnected()) {\n return;\n }\n\n // See `if (!this.hasSoftwareConnected())` above.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const accountingPlatform = this.softwarePackage!.id;\n\n await ApiService.remove(apiUrl(this.companyId));\n\n this.updateSyncState(Object.values(CodatDataType), 'unset');\n this.dataTypeLastSyncedAt(new Map());\n\n this.clearSelectedPayments();\n\n CompanyEventService.emit(\n AccountingSoftwareIntegrationEventsServiceEventType.AccountingPlatformDisconnected,\n {\n accountingPlatform,\n state: 'unlinked',\n }\n );\n }\n\n /**\n * Reset company accounting software sync state and clear selected payments\n */\n public resetSyncState() {\n this.updateSyncState(Object.values(CodatDataType), 'idle');\n this.dataTypeLastSyncedAt(new Map());\n\n this.clearSelectedPayments();\n }\n\n /**\n * Expire company accounting software sync state for current\n * company and clear selected payments\n */\n public expireSyncState() {\n this.updateSyncState(Object.values(CodatDataType), 'expired');\n\n this.clearSelectedPayments();\n }\n\n /**\n * Clear selected bills and invoices\n */\n private clearSelectedPayments() {\n this.clearBills();\n this.clearInvoices();\n }\n\n private clearBills() {\n CompanyAccountingSoftwareService.newBills.removeAll();\n this.HasUnsupportedBills(false);\n }\n\n private clearInvoices() {\n CompanyAccountingSoftwareService.newInvoices.removeAll();\n this.HasUnsupportedInvoices(false);\n }\n\n private async UpdateBills(): Promise {\n const { newBills } = CompanyAccountingSoftwareService;\n const { billsLoadingError } = CompanyAccountingSoftwareService;\n\n if (!this.hasSoftwareConnected()) {\n return;\n }\n\n try {\n // See `if (!this.hasSoftwareConnected())` above.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const bills = await this.softwarePackage!.GetBills();\n\n const supportedBills = bills.filter((checkBill) =>\n SUPPORTED_ACCOUNTING_CURRENCIES.includes(checkBill.currency)\n );\n\n if (supportedBills.length !== bills.length) {\n this.HasUnsupportedBills(true);\n }\n\n if (this.hasSoftwareConnected()) {\n // grab currently selected bills\n const payableBills = newBills().filter((checkBill) => checkBill.pay());\n\n newBills.removeAll();\n newBills(supportedBills);\n\n // re-select bills that were previously selected\n payableBills.forEach((payableBill) => {\n newBills().forEach((checkBill) => {\n if (checkBill.id === payableBill.id) {\n checkBill.pay(true);\n }\n });\n });\n }\n } catch (error) {\n billsLoadingError(error?.type ?? 'error');\n throw error;\n }\n }\n\n private async UpdateInvoices(): Promise {\n const { newInvoices } = CompanyAccountingSoftwareService;\n const { invoicesLoadingError } = CompanyAccountingSoftwareService;\n\n // if accounting software doesn't support invoices we'll skip the invoice sync\n if (!this.softwarePackage?.supportsInvoices) {\n return;\n }\n\n try {\n const invoices = await this.softwarePackage.GetInvoices();\n\n const supportedInvoices = invoices.filter((checkInvoice) =>\n SUPPORTED_ACCOUNTING_CURRENCIES.includes(checkInvoice.currency)\n );\n\n if (supportedInvoices.length !== invoices.length) {\n this.HasUnsupportedInvoices(true);\n }\n\n if (this.hasSoftwareConnected()) {\n // grab currently selected invoices\n const payableInvoices = newInvoices().filter((checkInvoice) => checkInvoice.pay());\n newInvoices.removeAll();\n newInvoices(supportedInvoices);\n\n // re-select invoices that were previously selected\n payableInvoices.forEach((payableInvoice) => {\n newInvoices().forEach((checkInvoice) => {\n if (checkInvoice.id === payableInvoice.id) {\n checkInvoice.pay(true);\n }\n });\n });\n }\n } catch (error) {\n invoicesLoadingError(error?.type ?? 'error');\n throw error;\n }\n }\n\n public getAttachments(paymentId: string): Promise> {\n return ApiService.get(apiUrl(this.companyId, `payments/${paymentId}/bill/attachments`));\n }\n\n public getPaymentRequestAttachments(paymentRequestId: string): Promise> {\n if (!paymentRequestId) {\n return Promise.resolve([]);\n }\n\n return ApiService.get>(\n apiUrl(this.companyId, `paymentRequests/${paymentRequestId}/attachments`)\n );\n }\n\n public getAttachmentsForBillId(\n billId: string\n ): Promise> {\n if (!billId) {\n return Promise.resolve([]);\n }\n\n const softwarePackage = this.softwarePackageObservable();\n if (\n softwarePackage == null ||\n // We don't support attachments for QBD, but there will still be a defined billId value.\n softwarePackage.id === SupportedAccountingSoftware.QuickBooksDesktop\n ) {\n return Promise.resolve([]);\n }\n\n return ApiService.get>(\n apiUrl(this.companyId, `/bills/${billId}/attachments`)\n );\n }\n\n public getAttachmentsForInvoiceId(\n invoiceId: string\n ): Promise> {\n return ApiService.get>(\n apiUrl(this.companyId, `/invoices/${invoiceId}/attachments`)\n );\n }\n\n public mapBillsToPaymentImport(\n bills: Array\n ): JQueryPromise> {\n return $.Deferred>((dfd) => {\n ApiService.post>(\n apiUrl(this.companyId, 'mapBillsToPaymentImport'),\n { body: bills }\n )\n .then((paymentsData) => {\n dfd.resolve(paymentsData);\n })\n .catch((error) => {\n dfd.reject(error);\n });\n }).promise();\n }\n\n public mapInvoicesToInvoiceImport(\n invoices: Array\n ): JQueryPromise> {\n return $.Deferred>((dfd) => {\n ApiService.post>(\n apiUrl(this.companyId, 'mapInvoicesToPaymentRequestImport'),\n { body: invoices }\n )\n .then((paymentsData) => {\n dfd.resolve(paymentsData);\n })\n .catch((error) => {\n dfd.reject(error);\n });\n }).promise();\n }\n\n public getPaymentAccountingSoftwareBills(\n paymentId: string\n ): JQueryPromise> {\n return $.Deferred>((dfd) => {\n const url = apiUrl(this.companyId, `/payments/${paymentId}/accountingSoftwareBills`);\n ApiService.get>(url)\n .then((data) => {\n dfd.resolve(data);\n })\n .catch((error) => {\n dfd.reject(error);\n });\n }).promise();\n }\n\n public getAccountingSoftwareAvailability(accountingSoftwareName: string) {\n return ApiService.get(apiUrl(this.companyId, `/integrationEnabled/${accountingSoftwareName}`));\n }\n\n private fireAccountingSoftwareSyncEvent(state: SyncState) {\n const accountingPlatform = this.softwarePackage?.id;\n\n CompanyEventService.emit(\n AccountingSoftwareIntegrationEventsServiceEventType.AccountingPlatformSync,\n {\n buttonName: 'Accounting Platform Sync',\n accountingPlatform,\n state,\n }\n );\n }\n\n public requeueFailedCompanyAccountingSoftwareBill(billId: string) {\n const url = apiUrl(this.companyId, `/bills/${billId}/requeue`);\n return ApiService.post(url);\n }\n}\n\nexport const Instance = new CompanyAccountingSoftwareService();\n","export enum AccountingSoftwareAvailability {\n Available,\n UpgradePlan,\n ContactSales,\n}\n\nexport type AccountingSoftware = {\n id: string;\n shortName: string;\n name: string;\n /** Company name associated on the accounting software integration-side */\n companyName?: string;\n icon: string;\n /** Availability for the current subscription plan, null when loading. */\n availability?: AccountingSoftwareAvailability | null;\n /** The accounting software is hidden (unavailable and cannot be enabled by the user). */\n hidden?: boolean | null;\n};\n","enum SyncType {\n /** Uses the 5-minute sync cache. */\n Manual,\n /** Uses the 15-minute sync cache. */\n Auto,\n /** Bypasses the sync cache entirely. */\n BypassCache,\n}\n\nexport default SyncType;\n","/**\n * Reconciliation method for reconciliation settings XHRs\n * @private\n */\nexport enum ReconciliationMethod {\n AutomaticReconciliation = 'AutomaticReconciliation',\n ManualReconciliation = 'ManualReconciliation',\n}\n\n/**\n * Response model for reconciliation settings XHRs\n */\nexport interface ReconciliationSettingsResponseModel {\n reconciliationMethod: ReconciliationMethod;\n skipBills: boolean;\n skipInvoices: boolean;\n /** QuickBooks Desktop Only **/\n skipContactsSync?: boolean;\n /** QuickBooks Desktop Only **/\n includeCustomerName?: boolean;\n}\n\n/**\n * Request model for reconciliation settings XHRs\n */\nexport type ReconciliationSettingsRequestModel = Partial;\n","import ko from 'knockout';\n\nimport { SUPPORTED_CURRENCIES } from '@/config/env';\nimport parseStringArray from '@/config/helpers/parseStringArray';\nimport { AccountingSoftware } from '@/features/accounting-software';\nimport { Instance as companyAccountingSoftwareService } from '@/features/accounting-software/services/companyAccountingSoftware';\nimport { getAuthorizationHeaderValue } from '@/features/api';\nimport type { Contact, TrackingCategoryOption } from '@/legacy/features/companies/documents/models';\nimport {\n AccountingSoftwareAccount,\n AccountingSoftwarePreferences,\n ApiResult,\n CompanyDocumentUploadSettings,\n ContactAddress,\n ContactDocumentUploadSettings,\n Currency,\n Document,\n DocumentBill,\n DocumentSubStatus,\n DocumentSuperStatus,\n DocumentType,\n EditorDocument,\n ExpenseItem,\n PaymentMethod,\n Supplier,\n TaxAccount,\n Terms,\n TrackingCategory,\n} from '@/legacy/features/companies/documents/models';\nimport Customer from '@/legacy/features/companies/documents/models/customer';\nimport AuthFetchService from '@/legacy/services/authFetch';\nimport * as companyService from '@/legacy/services/company';\nimport * as userService from '@/legacy/services/user';\n\nimport BillsPage from '../models/billsPage';\nimport BillsRequest from '../models/billsRequest';\n\nimport DocumentError from './documentError';\n\nfunction getCurrentUserId(): string {\n return userService.Instance.UserId();\n}\n\nfunction getCurrentCompanyId(): string {\n return companyService.Instance.CompanyId();\n}\n\nfunction apiURL(statics, ...dynamics): string {\n const finalUrl = [\n import.meta.env.FEATURE_DOCUMENTS_BASE_URL,\n import.meta.env.FEATURE_DOCUMENTS_API_BASE,\n ];\n statics.forEach((string, i) => {\n finalUrl.push(string, dynamics[i]);\n });\n return finalUrl.join('');\n}\n\nfunction getUpdateDocumentPayeeUrl(companyId: string): string {\n return apiURL`/company/${companyId}/document/payee`;\n}\n\nfunction documentListPage(companyId: string, page = 1): string {\n return apiURL`/files/${companyId}/${page}`;\n}\n\nfunction documentDataAPI(companyID: string, documentID: string): string {\n return apiURL`/company/${companyID}/document/${documentID}/data`;\n}\n\nfunction getCompanyDocumentsCountUrl(companyId: string): string {\n return apiURL`/companies/${companyId}/documents/count`;\n}\n\nfunction documentDataBulkAPI(companyID: string): string {\n return apiURL`/company/${companyID}/document`;\n}\n\nfunction documentDeleteDataBulkAPI(companyID: string): string {\n return apiURL`/company/${companyID}/document`;\n}\n\nfunction apiFileImageUrl(companyID: string, document: Document): string {\n return apiURL`/company/${companyID}/document/${document.id}/preview`;\n}\n\nfunction apiFileImageDownloadUrl(companyID: string): string {\n return apiURL`/company/${companyID}/document/download`;\n}\n\nfunction apiFileImagePreviewCodeUrl(companyID: string, documentId: string): string {\n return apiURL`/company/${companyID}/document/${documentId}/previewCode`;\n}\n\nfunction rawContactInfo(companyID: string, documentID: string): string {\n return apiURL`/company/${companyID}/document/${documentID}/rawcontactinfo`;\n}\n\nfunction signalrConnection(): string {\n return apiURL`/realtime/Negotiate`;\n}\n\nfunction signalrRegisterToCompany(): string {\n return apiURL`/realtime/RegisterToCompany`;\n}\n\nfunction documentAuditTrail(companyID: string, documentID: string): string {\n return apiURL`/company/${companyID}/document/${documentID}/audit`;\n}\n\nfunction getCompanyDocumentUploadSettingsUrl(\n companyId: string,\n accountingSoftware: string\n): string {\n return apiURL`/companies/${companyId}/documentUploadSettings?accountingSoftware=${accountingSoftware}`;\n}\n\nfunction getContactDocumentUploadSettingsUrl(\n companyId: string,\n contactId: string,\n accountingSoftware: string\n): string {\n return apiURL`/companies/${companyId}/contacts/${contactId}/documentUploadSettings?accountingSoftware=${accountingSoftware}`;\n}\n\nfunction getExpenseAccountsUrl(\n companyId: string,\n accountingSoftware: string,\n filterOutExcludedAccounts: boolean,\n includeAssetAndLiabilityAccounts: boolean,\n name?: string\n): string {\n const url = new URL(apiURL`/companies/${companyId}/${accountingSoftware}/expenseAccounts`);\n const { searchParams } = url;\n searchParams.append('filterOutExcludedAccounts', filterOutExcludedAccounts.toString());\n searchParams.append(\n 'includeAssetAndLiabilityAccounts',\n includeAssetAndLiabilityAccounts.toString()\n );\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getMarkAsPaidAccountsUrl(\n companyId: string,\n accountingSoftware: string,\n name?: string\n): string {\n const url = new URL(apiURL`/companies/${companyId}/${accountingSoftware}/markAsPaidAccounts`);\n const { searchParams } = url;\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getAssetAndLiabilityAccountsUrl(\n companyId: string,\n accountingSoftware: string,\n name?: string\n): string {\n const url = new URL(\n apiURL`/companies/${companyId}/${accountingSoftware}/assetAndLiabilityAccounts`\n );\n const { searchParams } = url;\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getPaymentAccountsUrl(\n companyId: string,\n accountingSoftware: string,\n paymentMethodId?: string,\n name?: string\n): string {\n const url = new URL(apiURL`/companies/${companyId}/${accountingSoftware}/payment-accounts`);\n const { searchParams } = url;\n if (paymentMethodId) {\n searchParams.append('payment-method', paymentMethodId);\n }\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getTaxAccountsUrl(\n companyId: string,\n accountingSoftware: string,\n filterOutExcludedAccounts: boolean\n): string {\n return apiURL`/companies/${companyId}/${accountingSoftware}/taxAccounts?filterOutExcludedAccounts=${filterOutExcludedAccounts}`;\n}\n\nfunction getExpenseItemsUrl(companyID: string, accountingSoftware: string, name?: string): string {\n const url = new URL(apiURL`/companies/${companyID}/${accountingSoftware}/items`);\n const { searchParams } = url;\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getCustomersUrl(companyID: string, accountingSoftware: string, name: string): string {\n return apiURL`/companies/${companyID}/${accountingSoftware}/customers?name=${name}`;\n}\n\nfunction documentPublishingUrl(companyID: string): string {\n return apiURL`/companies/${companyID}/bill`;\n}\n\nfunction getSuppliersUrl(companyId: string, accountingSoftware?: string, name?: string): string {\n const url = new URL(apiURL`/company/${companyId}/suppliers`);\n const { searchParams } = url;\n\n searchParams.append('accountingSoftware', accountingSoftware);\n\n if (name) {\n searchParams.append('name', name);\n }\n\n return url.toString();\n}\n\nfunction getCheckPermissionsUrl(companyID: string, accountingSoftware: string): string {\n return apiURL`/companies/${companyID}/${accountingSoftware}/permissions/bill/publish`;\n}\n\nfunction getCurrenciesUrl(companyId: string, accountingSoftware: string): string {\n return apiURL`/company/${companyId}/${accountingSoftware}/currencies`;\n}\n\nfunction getBillsUrl(companyId: string, query?: BillsQuery): string {\n const url = new URL(apiURL`/company/${companyId}/bills`);\n const { searchParams } = url;\n if (query) {\n Object.keys(query).forEach((key) => {\n if (key && query[key]) {\n searchParams.append(key, query[key]);\n }\n });\n }\n return url.toString();\n}\n\nfunction getSearchBillsUrl(companyId: string): string {\n const url = new URL(apiURL`/company/${companyId}/bills/search`);\n return url.toString();\n}\n\nfunction getBillsCurrenciesUrl(companyId: string): string {\n const url = new URL(apiURL`/company/${companyId}/bills/currencies`);\n return url.toString();\n}\n\nfunction getBillsByPaymentIdUrl(companyId: string, paymentId: string): string {\n return apiURL`/company/${companyId}/payments/${paymentId}/bills`;\n}\n\nfunction deleteBillsUrl(companyId: string): string {\n return apiURL`/company/${companyId}/bills`;\n}\n\nfunction createContactUrl(companyId: string, accountingSoftware: string): string {\n return apiURL`/companies/${companyId}/${accountingSoftware}/contacts`;\n}\n\nfunction getClassesUrl(companyId: string, accountingSoftware: string, name?: string) {\n const url = new URL(apiURL`/companies/${companyId}/${accountingSoftware}/classes`);\n const { searchParams } = url;\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getDepartmentsUrl(companyId: string, accountingSoftware: string, name?: string) {\n const url = new URL(apiURL`/companies/${companyId}/${accountingSoftware}/departments`);\n const { searchParams } = url;\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getLocationsUrl(companyId: string, accountingSoftware: string, name?: string) {\n const url = new URL(apiURL`/companies/${companyId}/${accountingSoftware}/locations`);\n const { searchParams } = url;\n if (name) {\n searchParams.append('name', name);\n }\n return url.toString();\n}\n\nfunction getPaymentMethodsUrl(companyId: string, accountingSoftware: string): string {\n return apiURL`/companies/${companyId}/${accountingSoftware}/payment-methods`;\n}\n\nfunction getTermsUrl(companyId: string, accountingSoftware: string): string {\n return apiURL`/companies/${companyId}/${accountingSoftware}/terms`;\n}\n\nfunction getRotateDocumentUrl(companyId: string, documentFileId: string): string {\n return apiURL`/company/${companyId}/document/${documentFileId}/rotate`;\n}\n\nfunction getTrackingCategoriesUrl(companyID: string, accountingSoftware: string): string {\n return apiURL`/companies/${companyID}/${accountingSoftware}/tracking-categories`;\n}\n\nfunction getAccountingSoftwarePreferencesUrl(companyId: string, accountingSoftware: string) {\n return apiURL`/companies/${companyId}/${accountingSoftware}/preferences`;\n}\n\nenum ErrorCodes {\n FailedToSendRequestToDocumentApi = 401,\n FailedToGetDownloadLinkDutToPermissions = 423,\n}\n\nconst failedToSendRequestMessage = 'Failed to send request';\n\ninterface BillsQuery {\n orderBy?: string;\n orderDirection?: string;\n skip?: number;\n take?: number;\n}\n\ninterface DocumentQuery {\n suppliers?: Array;\n /**\n * Possible Document statuses: Published (true | false).\n * Defaults to unpublished\n */\n superStatus?: DocumentSuperStatus;\n /**\n * Document status. Multiselect is possible.\n * Defaults to all\n */\n status?: Array;\n /**\n * Document amount.\n */\n pageSize?: number;\n /**\n * The date type to sort documents with\n * Defaults to UploadDate\n */\n sortKey?: string;\n /**\n * The direction of sorting for value.\n * True for oldest to newest, where nulls are first (for other than UploadDate)\n */\n ascending?: boolean;\n startInvoiceDate?: string;\n endInvoiceDate?: string;\n documentType?: DocumentType | null;\n}\n\ninterface DocumentsResponse extends ApiResult> {\n total: number;\n hasNext: boolean;\n page: number;\n}\n\ntype DocumentDataDictionary = { [id: string]: EditorDocument };\n\ninterface DocumentsUploadRequest {\n companyId: string;\n files: Array;\n}\n\ninterface DocumentsUploadResponse {\n isSuccess: boolean;\n}\n\n/**\n * Paginated response with next page indicator.\n */\ninterface HasNextResponse {\n total: number;\n hasNext: boolean;\n data: T;\n}\n\ninterface DocumentFileResponse {\n documentData: Blob;\n isPdf: boolean;\n}\n\ninterface ContactData {\n readonly address?: string;\n readonly city?: string;\n readonly companyName?: string;\n readonly contactMail?: string;\n readonly contactName?: string;\n readonly country?: string;\n readonly customerNumber?: string;\n readonly postcode?: string;\n readonly taxNumber?: string;\n readonly vatId?: string;\n}\n\ninterface AuditTrail {\n readonly date: string;\n readonly id: string;\n readonly email: string;\n readonly method: string;\n readonly name: string;\n readonly originalDocumentUri?: string;\n readonly publishedBy?: string;\n readonly publishedDate?: string;\n}\n\ninterface ContactViewModel {\n id: string;\n name: string;\n email: string;\n displayName: string;\n phoneNumber: string;\n address: ContactAddress;\n accountNumber: string;\n defaultExpenseAccountId: string;\n defaultTaxAccountId: string;\n defaultCustomerId: string;\n defaultCurrency: string;\n defaultMemo: string;\n isCustomer: boolean;\n isSupplier: boolean;\n optionsText: string;\n}\n\nexport default class DocumentService {\n static getCurrentAccountingSoftware() {\n return companyAccountingSoftwareService.softwareTypeObservable();\n }\n\n /** Check whether the current company's accounting software type is supported by the Documents feature. Not all types are. */\n static readonly isAccountingSoftwareSupported: KnockoutComputed = ko.pureComputed(() => {\n const companySoftwareType = companyAccountingSoftwareService.softwareTypeObservable();\n const hasSupportedAccountingSoftware = parseStringArray(\n import.meta.env.FEATURE_DOCUMENTS_SUPPORTED_ACCOUNTING_SOFTWARE\n ).includes(companySoftwareType);\n return hasSupportedAccountingSoftware;\n });\n\n static async rotateDocument(documentId: string): Promise {\n const url = getRotateDocumentUrl(getCurrentCompanyId(), documentId);\n return this.httpPost(url);\n }\n\n static async getCompanyDocumentsCount(): Promise {\n const url = getCompanyDocumentsCountUrl(getCurrentCompanyId());\n return this.httpGet(url);\n }\n\n static async patchDocumentsPayee(\n documentId: string,\n plootoContactId: string,\n accountingSoftwareContactId: string,\n name: string\n ): Promise {\n const url = new URL(getUpdateDocumentPayeeUrl(getCurrentCompanyId()));\n\n const body = {\n documentId,\n supplier: {\n payeeId: plootoContactId,\n contactId: accountingSoftwareContactId,\n name,\n },\n };\n\n return this.httpPatch(url, body);\n }\n\n static async getCurrencies(): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported()) {\n return [];\n }\n\n if (!accountingSoftware) {\n return SUPPORTED_CURRENCIES.map((code: string) => ({\n id: code,\n name: code,\n code,\n }));\n }\n\n const url = getCurrenciesUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpGet(url);\n }\n\n static async getEditorDocuments(fileId: string): Promise {\n const url = documentDataAPI(getCurrentCompanyId(), fileId);\n return this.httpGet(url);\n }\n\n static async deleteBills(documentBillIds: Array): Promise {\n const url = new URL(deleteBillsUrl(getCurrentCompanyId()));\n\n return AuthFetchService.httpDelete(url.toString(), JSON.stringify({ documentBillIds }));\n }\n\n static async getBills(query?: BillsQuery): Promise {\n const url = getBillsUrl(getCurrentCompanyId(), query);\n\n return this.httpGetRaw(url);\n }\n\n static async getBillsCurrencies(): Promise> {\n const url = getBillsCurrenciesUrl(getCurrentCompanyId());\n\n return this.httpGet>(url);\n }\n\n static async searchBills(request?: BillsRequest): Promise {\n const url = getSearchBillsUrl(getCurrentCompanyId());\n\n return this.httpPostRaw(url, request);\n }\n\n static async getBillsByPaymentId(paymentId: string): Promise> {\n const url = getBillsByPaymentIdUrl(getCurrentCompanyId(), paymentId);\n\n return this.httpGet(url);\n }\n\n static async getDocumentsList(\n page = 1,\n query?: DocumentQuery\n ): Promise>> {\n const url = new URL(documentListPage(getCurrentCompanyId(), page));\n\n return AuthFetchService.httpPost(url.toString(), JSON.stringify(query))\n .then((res) => res.json())\n .then((documentResponse: DocumentsResponse) => {\n if (!documentResponse.isSuccess) {\n throw new DocumentError(documentResponse.message, documentResponse.errorCode);\n }\n\n const { hasNext, data, total } = documentResponse;\n\n return { hasNext, data, total };\n });\n }\n\n static async getSuppliers(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n const url = getSuppliersUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n private static fileUploadRequest: XMLHttpRequest = null;\n\n static cancelFileUpload(): void {\n if (this.fileUploadRequest) {\n const request = this.fileUploadRequest;\n this.fileUploadRequest = null;\n request.abort();\n }\n }\n\n static async uploadFiles(\n request: DocumentsUploadRequest,\n progressHandler: (uploaded: number, total: number) => void\n ): Promise {\n const url = new URL(`${import.meta.env.FEATURE_DOCUMENTS_BASE_URL}/api/v1/upload`);\n\n if (request) {\n const data = new FormData();\n data.append('companyId', getCurrentCompanyId());\n\n request.files.forEach((file, index) => {\n data.append(`file${index}`, file, file.name);\n });\n\n return new Promise((resolve, reject) => {\n try {\n this.fileUploadRequest = new XMLHttpRequest();\n\n this.fileUploadRequest.onload = (event) => {\n const { status } = this.fileUploadRequest;\n this.fileUploadRequest = null;\n\n resolve({ isSuccess: status === 200 });\n };\n\n this.fileUploadRequest.onerror = () => {\n if (this.fileUploadRequest) {\n this.fileUploadRequest = null;\n\n resolve({ isSuccess: false });\n }\n };\n\n this.fileUploadRequest.open('POST', url.toString(), true);\n this.appendAuthorizationHeader(this.fileUploadRequest);\n\n this.fileUploadRequest.upload.addEventListener(\n 'progress',\n (event: ProgressEvent) => {\n progressHandler(event.loaded, event.total);\n },\n false\n );\n this.fileUploadRequest.send(data);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n return Promise.resolve(null);\n }\n\n private static appendAuthorizationHeader(xhr: XMLHttpRequest) {\n if (xhr) {\n xhr.setRequestHeader('Authorization', getAuthorizationHeaderValue());\n }\n }\n\n static async getDocument(document: Document): Promise {\n return AuthFetchService.httpGet(apiFileImageUrl(getCurrentCompanyId(), document))\n .then((response) => {\n if (!response.ok) {\n throw new DocumentError(`${response.status} ${response.statusText}`, response.status);\n }\n const responseTuple: [Promise, boolean] = [\n response.blob(),\n response.headers.get('Content-Type')?.includes('application/pdf'),\n ];\n return responseTuple;\n })\n .then(async (responseTuple) => {\n const documentData = await responseTuple[0];\n const isPdf = responseTuple[1];\n return { documentData, isPdf };\n });\n }\n\n static createDocumentDownloadLinks(documentIds: Array): Promise> {\n const url = apiFileImageDownloadUrl(getCurrentCompanyId());\n return this.httpPost(url, { documentIds });\n }\n\n static async createDocumentPreviewLink(documentId: string): Promise {\n const url = apiFileImagePreviewCodeUrl(getCurrentCompanyId(), documentId);\n const code = await this.httpPost(url);\n\n const uri = apiFileImageUrl(getCurrentCompanyId(), { id: documentId } as Document);\n return `${uri}?code=${code}`;\n }\n\n /**\n * Update document data in whole or partially for a specific document.\n * @param id Document ID to modify.\n * @param document The data to update.\n * @returns ```void```\n * @throws If HTTP response code ```< 200``` or ```> 299```.\n */\n static async patchDocument(\n id: string,\n document: Partial\n ): Promise {\n const url = new URL(documentDataAPI(getCurrentCompanyId(), id));\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n if (accountingSoftware) {\n url.searchParams.append('accountingSoftware', accountingSoftware);\n }\n return this.httpPatch(url, document);\n }\n\n /**\n * Update document data in whole or partially for several documents.\n * @param ids Document IDs to modify.\n * @param document The data to update.\n * @returns ```void```\n * @throws If HTTP response code ```< 200``` or ```> 299```.\n */\n static async bulkPatchDocument(\n ids: Array,\n document: Partial\n ): Promise> {\n const url = new URL(documentDataBulkAPI(getCurrentCompanyId()));\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n if (accountingSoftware) {\n url.searchParams.append('accountingSoftware', accountingSoftware);\n }\n ids.forEach((id) => url.searchParams.append('id', id));\n return this.httpPatch(url, document);\n }\n\n static async getDocumentContact(documentID: string): Promise {\n const url = rawContactInfo(getCurrentCompanyId(), documentID);\n return this.httpGet(url);\n }\n\n static async getSignalrCredentials(): Promise<{ accessToken: string; url: string }> {\n const url = new URL(signalrConnection());\n return AuthFetchService.httpGet(url.toString(), {\n 'X-Plooto-UserId': getCurrentUserId(),\n 'X-Plooto-CompanyId': getCurrentCompanyId(),\n }).then((res) => {\n if (!res.ok) {\n throw new DocumentError(\n `can't get SignalR connection data; status \"${res.status}\"`,\n res.status\n );\n }\n return res.json();\n });\n }\n\n static async deleteDocuments(documentIds: Array): Promise {\n const url = new URL(documentDeleteDataBulkAPI(getCurrentCompanyId()));\n documentIds.forEach((id) => url.searchParams.append('id', id));\n return AuthFetchService.httpDelete(url.toString()).then((res) => {\n if (!res.ok) {\n throw new DocumentError(`can't delete document(s); status \"${res.status}\"`, res.status);\n }\n });\n }\n\n static async registerToCompanyEvents(): Promise {\n const url = new URL(signalrRegisterToCompany());\n return AuthFetchService.httpPost(url.toString(), null, {\n 'X-Plooto-CompanyId': getCurrentCompanyId(),\n }).then((res) => {\n if (!res.ok) {\n throw new DocumentError(\n `can't register to SignalR group; status \"${res.status}\"`,\n res.status\n );\n }\n });\n }\n\n static async getAuditTrail(documentId: string): Promise {\n const url = documentAuditTrail(getCurrentCompanyId(), documentId);\n return this.httpGet(url);\n }\n\n static saveCompanyDocumentUploadSettings(\n companyDocumentUploadSettings: CompanyDocumentUploadSettings\n ): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n const url = new URL(\n getCompanyDocumentUploadSettingsUrl(getCurrentCompanyId(), accountingSoftware)\n );\n\n return AuthFetchService.httpPut(\n url.toString(),\n JSON.stringify(companyDocumentUploadSettings)\n ).then((res) => {\n if (!res.ok) {\n throw res.json();\n }\n });\n }\n\n static async getCompanyDocumentUploadSettings(): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n const url = getCompanyDocumentUploadSettingsUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpGet(url);\n }\n\n static async getContactDocumentUploadSettings(\n contactId: string\n ): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n const url = getContactDocumentUploadSettingsUrl(\n getCurrentCompanyId(),\n contactId,\n accountingSoftware\n );\n\n return this.httpGet(url);\n }\n\n static async updateContactDocumentAutoSyncSetting(\n autoSync: boolean,\n contactId: string\n ): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n const url = getContactDocumentUploadSettingsUrl(\n getCurrentCompanyId(),\n contactId,\n accountingSoftware\n );\n\n return AuthFetchService.httpPatch(\n url.toString(),\n JSON.stringify([\n {\n op: 'replace',\n path: '/autoSync',\n value: autoSync,\n },\n ])\n ).then((res) => {\n if (!res.ok) {\n throw res.json();\n }\n });\n }\n\n static async getExpenseAccounts(\n filterOutExcludedAccounts = true,\n includeAssetAndLiabilityAccounts = true,\n name: string = undefined\n ): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getExpenseAccountsUrl(\n getCurrentCompanyId(),\n accountingSoftware,\n filterOutExcludedAccounts,\n includeAssetAndLiabilityAccounts,\n name\n );\n\n return this.httpGet(url);\n }\n\n static async getMarkAsPaidAccounts(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getMarkAsPaidAccountsUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getAssetAndLiabilityAccounts(\n name?: string\n ): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getAssetAndLiabilityAccountsUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getPaymentAccounts(\n paymentMethodId?: string,\n name?: string\n ): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getPaymentAccountsUrl(\n getCurrentCompanyId(),\n accountingSoftware,\n paymentMethodId,\n name\n );\n\n return this.httpGet(url);\n }\n\n static async getTaxAccounts(filterOutExcludedAccounts = true): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getTaxAccountsUrl(\n getCurrentCompanyId(),\n accountingSoftware,\n filterOutExcludedAccounts\n );\n\n return this.httpGet(url);\n }\n\n static async createContact(contact: Contact): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n throw new DocumentError('not connected to accounting software');\n }\n\n const url = createContactUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpPost(url, contact);\n }\n\n static async getCustomers(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getCustomersUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getExpenseItems(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return [];\n }\n\n const url = getExpenseItemsUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getClasses(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported()) {\n return [];\n }\n\n if (\n accountingSoftware !== AccountingSoftware.QuickBooksOnline &&\n accountingSoftware !== AccountingSoftware.NetSuite\n ) {\n return [];\n }\n\n const url = getClassesUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getDepartments(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported()) {\n return [];\n }\n\n if (\n accountingSoftware !== AccountingSoftware.QuickBooksOnline &&\n accountingSoftware !== AccountingSoftware.NetSuite\n ) {\n return [];\n }\n\n const url = getDepartmentsUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getLocations(name?: string): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported()) {\n return [];\n }\n\n if (accountingSoftware !== AccountingSoftware.NetSuite) {\n return [];\n }\n\n const url = getLocationsUrl(getCurrentCompanyId(), accountingSoftware, name);\n\n return this.httpGet(url);\n }\n\n static async getPaymentMethods(): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (\n !this.isAccountingSoftwareSupported() ||\n accountingSoftware !== AccountingSoftware.QuickBooksOnline\n ) {\n return [];\n }\n\n const url = getPaymentMethodsUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpGet(url);\n }\n\n static async getTerms(): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (\n !this.isAccountingSoftwareSupported() ||\n accountingSoftware !== AccountingSoftware.QuickBooksOnline\n ) {\n return [];\n }\n\n const url = getTermsUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpGet(url);\n }\n\n static async getAccountingSoftwarePreferences(): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (!this.isAccountingSoftwareSupported() || !accountingSoftware) {\n return undefined;\n }\n\n const url = getAccountingSoftwarePreferencesUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpGet(url);\n }\n\n static publishDocument(documentIds: Array): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n const url = documentPublishingUrl(getCurrentCompanyId());\n\n return this.httpPost(url, { documentIds, accountingSoftware });\n }\n\n static async checkPermissions(): Promise {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (accountingSoftware !== AccountingSoftware.Xero) {\n // we need to check only Xero permissions for now\n return true;\n }\n\n const url = getCheckPermissionsUrl(getCurrentCompanyId(), accountingSoftware);\n\n try {\n return await this.httpGet(url);\n } catch {\n return false;\n }\n }\n\n static async getTrackingCategories(): Promise> {\n const accountingSoftware = DocumentService.getCurrentAccountingSoftware();\n\n if (accountingSoftware !== AccountingSoftware.Xero) {\n return [];\n }\n\n const url = getTrackingCategoriesUrl(getCurrentCompanyId(), accountingSoftware);\n\n return this.httpGet(url);\n }\n\n private static async httpGetRaw(url: string): Promise {\n let response: Response;\n\n try {\n response = await AuthFetchService.httpGet(url);\n } catch {\n throw new DocumentError(\n failedToSendRequestMessage,\n ErrorCodes.FailedToSendRequestToDocumentApi\n );\n }\n\n const json = await response.json();\n\n if (!json.isSuccess) {\n throw new DocumentError(json.message, json.errorCode);\n }\n\n return json as T;\n }\n\n /** @deprecated Use `ApiService` instead */\n private static async httpGet(url: string): Promise {\n const json: any = await this.httpGetRaw(url);\n\n return json.data as T;\n }\n\n /** @deprecated Use `ApiService` instead */\n private static async httpPost(url: string, body?: any): Promise {\n const json: any = await this.httpPostRaw(url, body);\n\n return json.data as T;\n }\n\n /** @deprecated Use `ApiService` instead */\n private static async httpPostRaw(url: string, body?: any): Promise {\n let response: Response;\n\n try {\n response = await AuthFetchService.httpPost(url.toString(), JSON.stringify(body), {\n 'Content-Type': 'application/json',\n });\n } catch {\n throw new DocumentError(\n failedToSendRequestMessage,\n ErrorCodes.FailedToSendRequestToDocumentApi\n );\n }\n\n const json = await response.json();\n\n if (!json.isSuccess) {\n throw new DocumentError(json.message, json.errorCode);\n }\n\n return json as T;\n }\n\n /** @deprecated Use `ApiService` instead */\n private static async httpPatch(url: URL, body?: any): Promise {\n let response: Response;\n\n try {\n response = await AuthFetchService.httpPatch(url.toString(), JSON.stringify(body), {\n 'Content-Type': 'application/json',\n });\n } catch {\n throw new DocumentError(\n failedToSendRequestMessage,\n ErrorCodes.FailedToSendRequestToDocumentApi\n );\n }\n\n const json = await response.json();\n\n if (!json.isSuccess) {\n throw new DocumentError(json.message, json.errorCode);\n }\n\n return json.data;\n }\n}\n\nexport {\n BillsQuery,\n DocumentQuery,\n ContactData,\n AuditTrail,\n Contact,\n ContactViewModel,\n DocumentDataDictionary,\n};\n","export default class DocumentError extends Error {\n public status?: number;\n\n public message: string;\n\n constructor(message: string, status?: number) {\n super(message);\n this.status = status;\n }\n}\n"],"names":["apiUrl","companyId","endpoint","query","cleanEndpoint","replace","url","URL","Object","create","globalThis","import_meta_env","APP_URLS_API_URL","API_PREFIX","entries","forEach","key","value","searchParams","set","toString","getAccountingSoftwareName","companyAccountingSoftwareService","softwarePackage","name","AccountingSoftwareBillStatus","CompanyAccountingSoftwareService","companyService","accountingSoftwareService","billsLoadingError","ko","newBills","invoicesLoadingError","newInvoices","syncStatus","dataTypeSyncState","Map","values","CodatDataType","map","dataType","dataTypeLastSyncedAt","HasUnsupportedBills","HasUnsupportedInvoices","CompanyId","softwareTypeObservable","read","companyMembership","membership","undefined","company","accountingSoftware","deferEvaluation","softwarePackageObservable","id","GetPackage","hasSoftwareConnected","_isNil","updateLastSyncedAt","dataTypes","when","next","updateSyncState","state","resync","syncType","SyncType","Auto","syncDataTypes","filteredDataTypes","filter","Bills","Invoices","HasPermissionTo","PermissionId","PAYMENT_ADD_EDIT","length","Promise","resolve","clearBills","clearInvoices","SyncData","then","all","UpdateBills","UpdateInvoices","fireAccountingSoftwareSyncEvent","Date","catch","errorInfo","type","clearSelectedPayments","RefreshInvoices","RefreshBills","disconnect","accountingPlatform","ApiService","remove","CompanyEventService","emit","AccountingSoftwareIntegrationEventsServiceEventType","AccountingPlatformDisconnected","resetSyncState","expireSyncState","removeAll","bills","GetBills","supportedBills","checkBill","SUPPORTED_ACCOUNTING_CURRENCIES","includes","currency","payableBills","pay","payableBill","error","supportsInvoices","invoices","GetInvoices","supportedInvoices","checkInvoice","payableInvoices","payableInvoice","getAttachments","paymentId","get","getPaymentRequestAttachments","paymentRequestId","getAttachmentsForBillId","billId","SupportedAccountingSoftware","QuickBooksDesktop","getAttachmentsForInvoiceId","invoiceId","mapBillsToPaymentImport","$","dfd","post","body","paymentsData","reject","promise","mapInvoicesToInvoiceImport","getPaymentAccountingSoftwareBills","data","getAccountingSoftwareAvailability","accountingSoftwareName","AccountingPlatformSync","buttonName","requeueFailedCompanyAccountingSoftwareBill","Instance","AccountingSoftwareAvailability","ReconciliationMethod","getCurrentUserId","userService","UserId","getCurrentCompanyId","apiURL","statics","dynamics","finalUrl","FEATURE_DOCUMENTS_BASE_URL","FEATURE_DOCUMENTS_API_BASE","string","i","push","join","getUpdateDocumentPayeeUrl","documentListPage","page","documentDataAPI","companyID","documentID","getCompanyDocumentsCountUrl","documentDataBulkAPI","documentDeleteDataBulkAPI","apiFileImageUrl","document","apiFileImageDownloadUrl","apiFileImagePreviewCodeUrl","documentId","rawContactInfo","signalrConnection","signalrRegisterToCompany","documentAuditTrail","getCompanyDocumentUploadSettingsUrl","getContactDocumentUploadSettingsUrl","contactId","getExpenseAccountsUrl","filterOutExcludedAccounts","includeAssetAndLiabilityAccounts","append","getMarkAsPaidAccountsUrl","getAssetAndLiabilityAccountsUrl","getPaymentAccountsUrl","paymentMethodId","getTaxAccountsUrl","getExpenseItemsUrl","getCustomersUrl","documentPublishingUrl","getSuppliersUrl","getCheckPermissionsUrl","getCurrenciesUrl","getBillsUrl","keys","getSearchBillsUrl","getBillsCurrenciesUrl","getBillsByPaymentIdUrl","deleteBillsUrl","createContactUrl","getClassesUrl","getDepartmentsUrl","getLocationsUrl","getPaymentMethodsUrl","getTermsUrl","getRotateDocumentUrl","documentFileId","getTrackingCategoriesUrl","getAccountingSoftwarePreferencesUrl","ErrorCodes","failedToSendRequestMessage","DocumentService","getCurrentAccountingSoftware","isAccountingSoftwareSupported","companySoftwareType","parseStringArray","FEATURE_DOCUMENTS_SUPPORTED_ACCOUNTING_SOFTWARE","rotateDocument","httpPost","getCompanyDocumentsCount","httpGet","patchDocumentsPayee","plootoContactId","accountingSoftwareContactId","supplier","payeeId","httpPatch","getCurrencies","SUPPORTED_CURRENCIES","code","getEditorDocuments","fileId","deleteBills","documentBillIds","AuthFetchService","httpDelete","JSON","stringify","getBills","httpGetRaw","getBillsCurrencies","searchBills","request","httpPostRaw","getBillsByPaymentId","getDocumentsList","res","json","documentResponse","isSuccess","DocumentError","message","errorCode","hasNext","total","getSuppliers","fileUploadRequest","cancelFileUpload","abort","uploadFiles","progressHandler","FormData","files","file","index","XMLHttpRequest","onload","event","status","onerror","open","appendAuthorizationHeader","upload","addEventListener","loaded","send","xhr","setRequestHeader","getAuthorizationHeaderValue","getDocument","response","ok","statusText","blob","headers","responseTuple","documentData","isPdf","createDocumentDownloadLinks","documentIds","createDocumentPreviewLink","patchDocument","bulkPatchDocument","ids","getDocumentContact","getSignalrCredentials","deleteDocuments","registerToCompanyEvents","getAuditTrail","saveCompanyDocumentUploadSettings","companyDocumentUploadSettings","httpPut","getCompanyDocumentUploadSettings","getContactDocumentUploadSettings","updateContactDocumentAutoSyncSetting","autoSync","op","path","getExpenseAccounts","getMarkAsPaidAccounts","getAssetAndLiabilityAccounts","getPaymentAccounts","getTaxAccounts","createContact","contact","getCustomers","getExpenseItems","getClasses","AccountingSoftware","QuickBooksOnline","NetSuite","getDepartments","getLocations","getPaymentMethods","getTerms","getAccountingSoftwarePreferences","publishDocument","checkPermissions","Xero","getTrackingCategories","FailedToSendRequestToDocumentApi","Error","constructor"],"sourceRoot":""}