Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-quickbooks
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-quickbooks` to build the library.

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-quickbooks",
"version": "0.0.9"
}

View File

@@ -0,0 +1,60 @@
{
"name": "pieces-quickbooks",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/quickbooks/src",
"projectType": "library",
"release": {
"version": {
"currentVersionResolver": "git-tag",
"preserveLocalDependencyProtocols": false,
"manifestRootsToUpdate": [
"dist/{projectRoot}"
]
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/quickbooks",
"tsConfig": "packages/pieces/community/quickbooks/tsconfig.lib.json",
"packageJson": "packages/pieces/community/quickbooks/package.json",
"main": "packages/pieces/community/quickbooks/src/index.ts",
"assets": [
"packages/pieces/community/quickbooks/*.md"
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/quickbooks",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,234 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
import { quickbooksAuth } from '../index';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
import {
QuickbooksAccount,
QuickbooksVendor,
QuickbooksPurchase,
QuickbooksRef,
} from '../lib/types';
export const createExpenseAction = createAction({
auth: quickbooksAuth,
name: 'create_expense',
displayName: 'Create Expense',
description: 'Creates an expense transaction (purchase) in QuickBooks.',
props: {
accountRef: Property.Dropdown({
auth: quickbooksAuth,
displayName: 'Bank/Credit Card Account',
description: 'The account from which the expense was paid.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect account', options: [] };
}
const { access_token, props } = auth as OAuth2PropertyValue;
const companyId = props?.['companyId'];
const apiUrl = quickbooksCommon.getApiUrl(companyId);
const query = `SELECT Id, Name, AccountType FROM Account STARTPOSITION 1 MAXRESULTS 1000`;
const response = await httpClient.sendRequest<QuickbooksEntityResponse<QuickbooksAccount>>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
if (response.body.Fault) {
throw new Error(
`QuickBooks API Error fetching accounts: ${response.body.Fault.Error.map(
(e: { Message: string }) => e.Message,
).join(', ')}`,
);
}
const accounts = response.body.QueryResponse?.['Account'] ?? [];
return {
disabled: false,
options: accounts.map((account) => ({
label: `${account.Name} (${account.AccountType})`,
value: account.Id,
})),
};
},
}),
paymentType: Property.StaticDropdown({
displayName: 'Payment Type',
required: true,
options: {
options: [
{ label: 'Cash', value: 'Cash' },
{ label: 'Check', value: 'Check' },
{ label: 'Credit Card', value: 'CreditCard' },
],
},
defaultValue: 'Cash',
}),
entityRef: Property.Dropdown({
auth: quickbooksAuth,
displayName: 'Payee (Vendor)',
description: 'Optional - The vendor the expense was paid to.',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect account', options: [] };
}
const { access_token, props } = auth as OAuth2PropertyValue;
const companyId = props?.['companyId'];
const apiUrl = quickbooksCommon.getApiUrl(companyId);
const query = `SELECT Id, DisplayName FROM Vendor STARTPOSITION 1 MAXRESULTS 1000`;
const response = await httpClient.sendRequest<QuickbooksEntityResponse<QuickbooksVendor>>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
if (response.body.Fault) {
throw new Error(
`QuickBooks API Error fetching vendors: ${response.body.Fault.Error.map(
(e: { Message: string }) => e.Message,
).join(', ')}`,
);
}
const vendors = response.body.QueryResponse?.['Vendor'] ?? [];
return {
disabled: false,
options: vendors.map((vendor) => ({
label: vendor.DisplayName,
value: vendor.Id,
})),
};
},
}),
txnDate: Property.DateTime({
displayName: 'Payment Date',
description: 'The date the expense occurred.',
required: false, // Defaults to today if empty
}),
// Line items for the expense details
lineItems: Property.Array({
displayName: 'Line Items',
description:
'Details of the expense (e.g., categories or items purchased). At least one line is required.',
required: true,
properties: {
amount: Property.Number({
displayName: 'Amount',
required: true,
}),
description: Property.ShortText({
displayName: 'Description',
required: false,
}),
detailType: Property.StaticDropdown({
displayName: 'Detail Type',
required: true,
options: {
options: [
{
label: 'Account Based Expense Line Detail',
value: 'AccountBasedExpenseLineDetail',
},
],
},
defaultValue: 'AccountBasedExpenseLineDetail',
}),
expenseAccountId: Property.ShortText({
displayName: 'Expense Category/Account ID',
description:
'Enter the ID of the Expense Account. Required for AccountBasedExpenseLineDetail.',
required: true,
}),
},
}),
privateNote: Property.LongText({
displayName: 'Memo (Private Note)',
description: 'Internal note about the expense.',
required: false,
}),
},
async run(context) {
const { access_token } = context.auth;
const companyId = context.auth.props?.['companyId'];
const apiUrl = quickbooksCommon.getApiUrl(companyId as string);
const props = context.propsValue;
const lines = (props['lineItems'] as any[]).map((line) => {
const detail: any = {
Amount: line['amount'],
Description: line['description'],
DetailType: line['detailType'],
};
if (line['detailType'] === 'AccountBasedExpenseLineDetail') {
if (!line['expenseAccountId']) {
throw new Error(
'Expense Category/Account ID is required for Account Based Expense Line Detail.',
);
}
detail.AccountBasedExpenseLineDetail = {
AccountRef: { value: line['expenseAccountId'] },
};
}
return detail;
});
if (lines.length === 0) {
throw new Error('At least one line item is required.');
}
const expensePayload: Partial<QuickbooksPurchase> = {
AccountRef: { value: props['accountRef'] },
PaymentType: props['paymentType'] as 'Cash' | 'Check' | 'CreditCard',
Line: lines,
...(props['entityRef'] && { EntityRef: { value: props['entityRef'] } as QuickbooksRef }),
...(props['txnDate'] && { TxnDate: props['txnDate'].split('T')[0] }),
...(props['privateNote'] && { PrivateNote: props['privateNote'] }),
};
const endpoint = 'purchase';
const response = await httpClient.sendRequest<{
Purchase: QuickbooksPurchase;
time: string;
Fault?: { Error: { Message: string; Detail?: string; code: string }[]; type: string };
}>({
method: HttpMethod.POST,
url: `${apiUrl}/${endpoint}`,
queryParams: { minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: expensePayload,
});
if (response.body.Fault) {
throw new Error(
`QuickBooks API Error creating expense: ${response.body.Fault.Error.map(
(e: any) => e.Message,
).join(', ')} - Detail: ${response.body.Fault.Error.map((e: any) => e.Detail).join(', ')}`,
);
}
return response.body.Purchase;
},
});

View File

@@ -0,0 +1,233 @@
import {
createAction,
Property,
OAuth2PropertyValue,
} from '@activepieces/pieces-framework';
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
import { quickbooksAuth } from '../index';
import { QuickbooksEntityResponse, quickbooksCommon } from '../lib/common';
import { QuickbooksCustomer, QuickbooksInvoice, QuickbooksRef } from '../lib/types';
export const createInvoiceAction = createAction({
auth: quickbooksAuth,
name: 'create_invoice',
displayName: 'Create Invoice',
description: 'Creates an invoice in QuickBooks.',
props: {
customerRef: Property.Dropdown({
auth: quickbooksAuth,
displayName: 'Customer',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
const { access_token, props } = auth as OAuth2PropertyValue;
const companyId = props?.['companyId'];
const apiUrl = quickbooksCommon.getApiUrl(companyId);
const query = `SELECT Id, DisplayName FROM Customer STARTPOSITION 1 MAXRESULTS 1000`;
const response = await httpClient.sendRequest<QuickbooksEntityResponse<QuickbooksCustomer>>(
{
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
},
);
if (response.body.Fault) {
throw new Error(
`QuickBooks API Error: ${response.body.Fault.Error.map(
(e: { Message: string }) => e.Message,
).join(', ')}`,
);
}
const customers = response.body.QueryResponse?.['Customer'] ?? [];
return {
disabled: false,
options: customers.map((customer) => ({
label: customer.DisplayName,
value: customer.Id,
})),
};
},
}),
lineItems: Property.Array({
displayName: 'Line Items',
description: 'Line items for the invoice',
required: true,
properties: {
description: Property.ShortText({
displayName: 'Description',
required: false,
}),
amount: Property.Number({
displayName: 'Amount',
description: 'Total amount for this line (Exclusive of tax). Required.',
required: true,
}),
detailType: Property.StaticDropdown({
displayName: 'Detail Type',
required: true,
options: {
options: [{ label: 'Sales Item Line Detail', value: 'SalesItemLineDetail' }],
},
defaultValue: 'SalesItemLineDetail',
}),
itemId: Property.ShortText({
displayName: 'Item ID (Product/Service)',
description:
'Enter the ID of the Item (Product/Service). Required for SalesItemLineDetail.',
required: true,
}),
quantity: Property.Number({
displayName: 'Quantity',
required: false,
}),
unitPrice: Property.Number({
displayName: 'Unit Price',
description:
'If specified, Amount will be Qty * UnitPrice. If Amount is also specified, Amount overrides calculation.',
required: false,
}),
},
}),
emailStatus: Property.StaticDropdown({
displayName: 'Email Status',
description: 'Specify whether the invoice should be emailed after creation.',
required: false,
options: {
options: [
{ label: 'Not Set (Default - No Email)', value: 'NotSet' },
{ label: 'Needs To Be Sent', value: 'NeedToSend' },
],
},
defaultValue: 'NotSet',
}),
billEmail: Property.ShortText({
displayName: 'Billing Email Address',
description:
'Email address to send the invoice to. Required if Email Status is "Needs To Be Sent". Overrides customer default.',
required: false,
}),
dueDate: Property.DateTime({
displayName: 'Due Date',
description:
'The date when the payment for the invoice is due. If not provided, default term from customer or company is used.',
required: false,
}),
docNumber: Property.ShortText({
displayName: 'Invoice Number',
description:
'Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.',
required: false,
}),
txnDate: Property.DateTime({
displayName: 'Transaction Date',
description:
'The date entered on the transaction. Defaults to the current date if not specified.',
required: false,
}),
privateNote: Property.LongText({
displayName: 'Private Note (Memo)',
description: 'Note to self. Does not appear on the invoice sent to the customer.',
required: false,
}),
customerMemo: Property.LongText({
displayName: 'Customer Memo (Statement Memo)',
description:
'Memo to be displayed on the invoice sent to the customer (appears on statement).',
required: false,
}),
},
async run(context) {
const { access_token } = context.auth;
const companyId = context.auth.props?.['companyId'];
const apiUrl = quickbooksCommon.getApiUrl(companyId as string);
const props = context.propsValue;
if (props['emailStatus'] === 'NeedToSend' && !props['billEmail']) {
throw new Error('Billing Email Address is required when Email Status is "Needs To Be Sent".');
}
const lineItems = (props['lineItems'] as any[]).map((item: any) => {
if (item['detailType'] === 'SalesItemLineDetail') {
if (!item['itemId']) {
throw new Error('Item ID is required for Sales Item Line Detail.');
}
return {
Amount: item['amount'],
DetailType: item['detailType'],
Description: item['description'],
SalesItemLineDetail: {
ItemRef: { value: item['itemId'] } as QuickbooksRef,
...(item['quantity'] != null && { Qty: item['quantity'] }),
...(item['unitPrice'] != null && { UnitPrice: item['unitPrice'] }),
},
};
} else {
return {
Amount: item['amount'],
DetailType: item['detailType'],
Description: item['description'],
};
}
});
if (lineItems.length === 0) {
throw new Error('At least one line item is required to create an invoice.');
}
const invoicePayload = {
Line: lineItems,
CustomerRef: { value: props['customerRef'] } as QuickbooksRef,
...(props['emailStatus'] && { EmailStatus: props['emailStatus'] }),
...(props['billEmail'] && { BillEmail: { Address: props['billEmail'] } }),
...(props['dueDate'] && { DueDate: props['dueDate'].split('T')[0] }),
...(props['docNumber'] && { DocNumber: props['docNumber'] }),
...(props['txnDate'] && { TxnDate: props['txnDate'].split('T')[0] }),
...(props['privateNote'] && { PrivateNote: props['privateNote'] }),
...(props['customerMemo'] && { CustomerMemo: { value: props['customerMemo'] } }),
};
const response = await httpClient.sendRequest<{
Invoice: QuickbooksInvoice;
time: string;
Fault?: { Error: { Message: string; Detail?: string; code: string }[]; type: string };
}>({
method: HttpMethod.POST,
url: `${apiUrl}/invoice`,
queryParams: { minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: invoicePayload,
});
if (response.body.Fault) {
throw new Error(
`QuickBooks API Error: ${response.body.Fault.Error.map((e: any) => e.Message).join(
', ',
)} - ${response.body.Fault.Error.map((e: any) => e.Detail).join(', ')}`,
);
}
return response.body.Invoice;
},
});

View File

@@ -0,0 +1,122 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod, httpClient, AuthenticationType } from '@activepieces/pieces-common';
import { quickbooksAuth } from '../index';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
export const findCustomerAction = createAction({
auth: quickbooksAuth,
name: 'find_customer',
displayName: 'Find Customer',
description: 'Search for a customer by display name in QuickBooks.',
props: {
search_term: Property.ShortText({
displayName: 'Customer Name',
description: 'The display name of the customer to search for.',
required: true,
}),
},
async run(context) {
const { search_term } = context.propsValue;
const companyId = context.auth.props?.['companyId'];
if (!companyId) {
throw new Error('Realm ID not found in authentication data. Please reconnect your account.');
}
const apiUrl = quickbooksCommon.getApiUrl(companyId as string);
const query = `SELECT * FROM Customer WHERE DisplayName = '${search_term.replace(
/'/g,
"\\'",
)}' MAXRESULTS 1`;
const response = await httpClient.sendRequest<QuickbooksEntityResponse<QuickBooksCustomer>>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: {
query: query,
minorversion: '70',
},
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: context.auth.access_token,
},
headers: {
Accept: 'application/json',
},
});
if (
response.body?.QueryResponse?.['Customer'] &&
response.body.QueryResponse['Customer'].length > 0
) {
return {
found: true,
result: response.body.QueryResponse['Customer'][0],
};
}
return {
found: false,
result: {},
};
},
});
interface QuickBooksCustomer {
Id: string;
SyncToken: string;
MetaData?: {
CreateTime: string;
LastUpdatedTime: string;
};
GivenName?: string;
FamilyName?: string;
FullyQualifiedName?: string;
CompanyName?: string;
DisplayName: string;
PrintOnCheckName?: string;
Active?: boolean;
PrimaryPhone?: {
FreeFormNumber: string;
};
PrimaryEmailAddr?: {
Address: string;
};
BillAddr?: QuickBooksAddress;
ShipAddr?: QuickBooksAddress;
Notes?: string;
Job?: boolean;
BillWithParent?: boolean;
ParentRef?: QuickBooksRef;
Level?: number;
Taxable?: boolean;
Balance?: number;
BalanceWithJobs?: number;
CurrencyRef?: QuickBooksRef;
PreferredDeliveryMethod?: string;
PaymentMethodRef?: QuickBooksRef;
domain?: string;
sparse?: boolean;
}
interface QuickBooksAddress {
Id?: string;
Line1?: string;
Line2?: string;
Line3?: string;
Line4?: string;
Line5?: string;
City?: string;
Country?: string;
CountrySubDivisionCode?: string;
PostalCode?: string;
Lat?: string;
Long?: string;
Tag?: string;
PostalCodeSuffix?: string;
}
interface QuickBooksRef {
value: string;
name?: string;
}

View File

@@ -0,0 +1,165 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod, httpClient, AuthenticationType } from '@activepieces/pieces-common';
import { quickbooksAuth } from '../index';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
interface QuickBooksRef {
value: string;
name?: string;
}
interface QuickBooksAddress {
Id?: string;
Line1?: string;
Line2?: string;
Line3?: string;
Line4?: string;
Line5?: string;
City?: string;
Country?: string;
CountrySubDivisionCode?: string;
PostalCode?: string;
Lat?: string;
Long?: string;
Tag?: string;
PostalCodeSuffix?: string;
}
interface QuickBooksCustomField {
DefinitionId: string;
Name?: string;
Type: string;
StringValue?: string;
}
interface QuickBooksLinkedTxn {
TxnId: string;
TxnType: string;
}
interface QuickBooksTaxLineDetail {
NetAmountTaxable?: number;
TaxPercent?: number;
TaxRateRef?: QuickBooksRef;
PercentBased?: boolean;
}
interface QuickBooksTaxLine {
DetailType: string;
Amount?: number;
TaxLineDetail?: QuickBooksTaxLineDetail;
}
interface QuickBooksInvoice {
Id: string;
SyncToken: string;
MetaData?: {
CreateTime: string;
LastUpdatedTime: string;
};
CustomField?: QuickBooksCustomField[];
DocNumber?: string;
TxnDate?: string;
domain?: string;
sparse?: boolean;
CustomerRef: QuickBooksRef;
ProjectRef?: QuickBooksRef;
SalesTermRef?: QuickBooksRef;
BillEmail?: {
Address: string;
};
TotalAmt?: number;
CurrencyRef?: QuickBooksRef;
LinkedTxn?: QuickBooksLinkedTxn[];
Line: QuickBooksInvoiceLine[];
TxnTaxDetail?: {
TxnTaxCodeRef?: QuickBooksRef;
TotalTax?: number;
TaxLine?: QuickBooksTaxLine[];
};
DueDate?: string;
Balance?: number;
Deposit?: number;
ApplyTaxAfterDiscount?: boolean;
PrintStatus?: string;
EmailStatus?: string;
ShipAddr?: QuickBooksAddress;
BillAddr?: QuickBooksAddress;
CustomerMemo?: { value: string };
}
interface QuickBooksInvoiceLine {
Id?: string;
LineNum?: number;
Description?: string;
Amount: number;
DetailType: string;
SalesItemLineDetail?: {
ItemRef: QuickBooksRef;
TaxCodeRef?: QuickBooksRef;
UnitPrice?: number;
Qty?: number;
};
SubTotalLineDetail?: {
ItemRef?: QuickBooksRef;
};
}
export const findInvoiceAction = createAction({
auth: quickbooksAuth,
name: 'find_invoice',
displayName: 'Find Invoice',
description: 'Search for an invoice by its number in QuickBooks.',
props: {
invoice_number: Property.ShortText({
displayName: 'Invoice Number',
description: 'The document number (DocNumber) of the invoice to search for.',
required: true,
}),
},
async run(context) {
const { invoice_number } = context.propsValue;
const companyId = context.auth.props?.['companyId'];
if (!companyId) {
throw new Error('Realm ID not found in authentication data. Please reconnect your account.');
}
const apiUrl = quickbooksCommon.getApiUrl(companyId as string);
const query = `SELECT * FROM Invoice WHERE DocNumber = '${invoice_number.replace(
/'/g,
"\\'",
)}' MAXRESULTS 1`;
const response = await httpClient.sendRequest<QuickbooksEntityResponse<QuickBooksInvoice>>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: {
query: query,
minorversion: '70',
},
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: context.auth.access_token,
},
headers: {
Accept: 'application/json',
},
});
if (
response.body?.QueryResponse?.['Invoice'] &&
response.body.QueryResponse['Invoice'].length > 0
) {
return {
found: true,
result: response.body.QueryResponse['Invoice'][0],
};
}
return {
found: false,
result: {},
};
},
});

View File

@@ -0,0 +1,97 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickbooksAuth } from '../index'; // Correct path relative to actions/find-payment.ts
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
interface QuickbooksPayment {
Id: string;
SyncToken?: string;
domain?: string;
MetaData?: {
CreateTime: string;
LastUpdatedTime: string;
};
TxnDate?: string;
CurrencyRef?: {
value: string;
name?: string;
};
CustomerRef: {
value: string;
name?: string;
};
DepositToAccountRef?: {
value: string;
name?: string;
};
ProjectRef?: {
value: string;
name?: string;
};
PaymentMethodRef?: {
value: string;
name?: string;
};
PaymentRefNum?: string;
TotalAmt: number;
UnappliedAmt?: number;
ProcessPayment?: boolean;
sparse?: boolean;
Line?: {
Amount: number;
LinkedTxn?: {
TxnId: string;
TxnType: string;
}[];
LineEx?: any;
}[];
}
export const findPaymentAction = createAction({
auth: quickbooksAuth,
name: 'find_payment',
displayName: 'Find Payment',
description: 'Finds an existing payment in QuickBooks.',
props: {
customerId: Property.ShortText({
displayName: 'Customer ID',
description: 'The ID of the customer to find payments for.',
required: true,
}),
},
async run(context) {
const { customerId } = context.propsValue;
const companyId = context.auth.props?.['companyId'];
if (!companyId) {
throw new Error('Realm ID not found in authentication data. Please reconnect.');
}
const apiUrl = quickbooksCommon.getApiUrl(companyId as string);
const query = `SELECT * FROM Payment WHERE CustomerRef = '${customerId}'`;
const response = await httpClient.sendRequest<QuickbooksEntityResponse<QuickbooksPayment>>({
method: HttpMethod.GET,
url: `${apiUrl}/query?query=${encodeURIComponent(query)}&minorversion=70`,
headers: {
Authorization: `Bearer ${context.auth.access_token}`,
Accept: 'application/json',
},
});
if (
response.body.QueryResponse?.['Payment'] &&
response.body.QueryResponse?.['Payment'].length > 0
) {
return {
found: true,
result: response.body.QueryResponse?.['Payment'],
};
}
return {
found: false,
result: [],
};
},
});

View File

@@ -0,0 +1,78 @@
{
"Company ID": "Firmen-ID",
"You can find Company ID under **settings->Additional Info**.": "Sie finden die Firmen-ID unter **Einstellungen->Weitere Info**.",
"Find Invoice": "Rechnung finden",
"Find Customer": "Kunde finden",
"Find Payment": "Zahlung finden",
"Create Invoice": "Rechnung erstellen",
"Create Expense": "Ausgaben erstellen",
"Custom API Call": "Eigener API-Aufruf",
"Search for an invoice by its number in QuickBooks.": "Suchen Sie eine Rechnung nach ihrer Nummer in QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Suche nach einem Kunden nach Anzeigenamen in QuickBooks.",
"Finds an existing payment in QuickBooks.": "Findet eine bestehende Zahlung in QuickBooks.",
"Creates an invoice in QuickBooks.": "Erstellt eine Rechnung in QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Erstellt eine Ausgabentransaktion (Kauf) in QuickBooks.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Invoice Number": "Rechnungsnummer",
"Customer Name": "Kundenname",
"Customer ID": "Kunden-ID",
"Customer": "Kunde",
"Line Items": "Zeilenelemente",
"Email Status": "Email Status",
"Billing Email Address": "Rechnungsadresse",
"Due Date": "Fälligkeitsdatum",
"Transaction Date": "Transaktionsdatum",
"Private Note (Memo)": "Private Notiz (Memo)",
"Customer Memo (Statement Memo)": "Kunden-Memo (Statement Memo)",
"Bank/Credit Card Account": "Bank/Kreditkartenkonto",
"Payment Type": "Zahlungsart",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Zahlungsdatum",
"Memo (Private Note)": "Notiz (Private Notiz)",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"The document number (DocNumber) of the invoice to search for.": "Die Dokumentennummer (DocNumber) der zu suchenden Rechnung.",
"The display name of the customer to search for.": "Der Anzeigename des zu suchenden Kunden.",
"The ID of the customer to find payments for.": "Die ID des Kunden zu finden Zahlungen für.",
"Line items for the invoice": "Artikel für die Rechnung",
"Specify whether the invoice should be emailed after creation.": "Geben Sie an, ob die Rechnung nach der Erstellung per E-Mail versandt werden soll.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "E-Mail-Adresse, an die die Rechnung gesendet werden soll. Wird benötigt, wenn der E-Mail-Status \"Gesendet werden muss\". Überschreibt die Kunden-Standardeinstellung.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "Das Datum der Zahlung für die Rechnung ist fällig. Wenn nicht angegeben, wird die Zahlungsfrist des Kunden oder der Firma verwendet.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Optionale Referenznummer für die Rechnung. Falls nicht angegeben, weist QuickBooks die nächste sequentielle Nummer zu.",
"The date entered on the transaction. Defaults to the current date if not specified.": "Das auf der Transaktion eingegebene Datum. Standardwert ist das aktuelle Datum, wenn nicht angegeben.",
"Note to self. Does not appear on the invoice sent to the customer.": "Hinweis an sich. Wird nicht auf der Rechnung an den Kunden angezeigt.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Memo wird auf der Rechnung angezeigt, die an den Kunden gesendet wird (erscheint auf Rechnung).",
"The account from which the expense was paid.": "Das Konto, von dem die Kosten gezahlt wurden.",
"Optional - The vendor the expense was paid to.": "Optional - Der Verkäufer, an den die Kosten gezahlt wurden.",
"The date the expense occurred.": "Das Datum des Aufwands.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Details des Aufwandes (z.B. Kategorien oder Artikel gekauft). Mindestens eine Zeile ist erforderlich.",
"Internal note about the expense.": "Interne Notiz über die Kosten.",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"Not Set (Default - No Email)": "Nicht gesetzt (Standard - keine E-Mail)",
"Needs To Be Sent": "Muss gesendet werden",
"Cash": "Bargeld",
"Check": "Prüfen",
"Credit Card": "Kreditkarte",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Invoice": "Neue Rechnung",
"New Expense (Purchase)": "Neue Ausgaben (Urchase)",
"New Customer": "Neuer Kunde",
"New Deposit": "Neue Einzahlung",
"New Transfer": "Neuer Transfer",
"Triggers when an invoice is created .": "Wird ausgelöst, wenn eine Rechnung erstellt wird .",
"Triggers when an Expense (Purchase) is created.": "Wird ausgelöst, wenn eine Ausgabe erstellt wird (Purchase).",
"Triggers when a new customer is created.": "Wird ausgelöst, wenn ein neuer Kunde erstellt wird.",
"Triggers when a Deposit is created.": "Wird ausgelöst, wenn eine Kaution erstellt wurde.",
"Triggers when a Transfer is created.": "Wird ausgelöst, wenn ein Transfer erstellt wird."
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "ID de empresa",
"You can find Company ID under **settings->Additional Info**.": "Puede encontrar el ID de la compañía en **ajustes->Información adicional**.",
"Find Invoice": "Buscar factura",
"Find Customer": "Buscar cliente",
"Find Payment": "Buscar pago",
"Create Invoice": "Crear factura",
"Create Expense": "Crear gastos",
"Custom API Call": "Llamada API personalizada",
"Search for an invoice by its number in QuickBooks.": "Busca una factura por número en QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Buscar un cliente por nombre para mostrar en QuickBooks.",
"Finds an existing payment in QuickBooks.": "Encuentra un pago existente en QuickBooks.",
"Creates an invoice in QuickBooks.": "Crea una factura en QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Crea una transacción de gastos (compra) en QuickBooks.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Invoice Number": "Número de factura",
"Customer Name": "Nombre del cliente",
"Customer ID": "ID del cliente",
"Customer": "Cliente",
"Line Items": "Ítems de línea",
"Email Status": "Email Status",
"Billing Email Address": "Dirección de email de facturación",
"Due Date": "Fecha de fin",
"Transaction Date": "Fecha de la transacción",
"Private Note (Memo)": "Nota privada (Memo)",
"Customer Memo (Statement Memo)": "Nota del cliente (declaración de memoria)",
"Bank/Credit Card Account": "Cuenta bancaria/tarjeta de crédito",
"Payment Type": "Tipo de pago",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Fecha de pago",
"Memo (Private Note)": "Memo (Nota privada)",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"The document number (DocNumber) of the invoice to search for.": "El número de documento (DocNumber) de la factura a buscar.",
"The display name of the customer to search for.": "El nombre mostrado del cliente a buscar.",
"The ID of the customer to find payments for.": "El ID del cliente para encontrar pagos.",
"Line items for the invoice": "Elementos de línea para la factura",
"Specify whether the invoice should be emailed after creation.": "Especifique si la factura debe enviarse por correo electrónico después de la creación.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Dirección de correo electrónico a la que enviar la factura. Requerido si el estado del correo electrónico es \"Necesita ser enviado\". Reemplaza el valor predeterminado del cliente.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "La fecha en que el pago de la factura es vencido. Si no se proporciona, se utiliza el término por defecto del cliente o la empresa.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Número de referencia opcional para la factura. Si no se proporciona, QuickBooks asigna el siguiente número secuencial.",
"The date entered on the transaction. Defaults to the current date if not specified.": "La fecha introducida en la transacción. Por defecto es la fecha actual si no se especifica.",
"Note to self. Does not appear on the invoice sent to the customer.": "Nota a sí misma. No aparece en la factura enviada al cliente.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Nota que se mostrará en la factura enviada al cliente (aparece en el extracto).",
"The account from which the expense was paid.": "La cuenta desde la cual se pagó el gasto.",
"Optional - The vendor the expense was paid to.": "Opcional - El proveedor al que se pagó el gasto.",
"The date the expense occurred.": "La fecha en que los gastos ocurrieron.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Detalles del gasto (por ejemplo, categorías o artículos comprados). Se requiere al menos una línea.",
"Internal note about the expense.": "Nota interna sobre el gasto.",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"Not Set (Default - No Email)": "No establecido (por defecto - Sin correo electrónico)",
"Needs To Be Sent": "Necesita ser enviado",
"Cash": "Dinero",
"Check": "Comprobar",
"Credit Card": "Tarjeta de crédito",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Invoice": "Nueva factura",
"New Expense (Purchase)": "Nuevo gasto (compra)",
"New Customer": "Nuevo cliente",
"New Deposit": "Nuevo depósito",
"New Transfer": "Nueva transferencia",
"Triggers when an invoice is created .": "Se activa cuando se crea una factura .",
"Triggers when an Expense (Purchase) is created.": "Disparadores cuando se crea un gasto (Purchase).",
"Triggers when a new customer is created.": "Dispara cuando se crea un nuevo cliente.",
"Triggers when a Deposit is created.": "Dispara cuando se crea un depósito.",
"Triggers when a Transfer is created.": "Dispara cuando se crea una transferencia."
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "ID de la société",
"You can find Company ID under **settings->Additional Info**.": "Vous pouvez trouver l'ID de la société dans **paramètres->Infos supplémentaires**.",
"Find Invoice": "Trouver une facture",
"Find Customer": "Trouver le client",
"Find Payment": "Trouver le paiement",
"Create Invoice": "Créer une facture",
"Create Expense": "Créer une dépense",
"Custom API Call": "Appel API personnalisé",
"Search for an invoice by its number in QuickBooks.": "Recherchez une facture par son numéro dans QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Rechercher un client par nom affiché dans QuickBooks.",
"Finds an existing payment in QuickBooks.": "Trouve un paiement existant dans QuickBooks.",
"Creates an invoice in QuickBooks.": "Crée une facture dans QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Crée une transaction de dépense (achat) dans QuickBooks.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Invoice Number": "Numéro de facture",
"Customer Name": "Nom du client",
"Customer ID": "ID du client",
"Customer": "Client",
"Line Items": "Lignes",
"Email Status": "Email Status",
"Billing Email Address": "Adresse e-mail de facturation",
"Due Date": "Date de fin",
"Transaction Date": "Date de la transaction",
"Private Note (Memo)": "Note privée (Mémo)",
"Customer Memo (Statement Memo)": "Mémo client (Déclaration Mémo)",
"Bank/Credit Card Account": "Compte bancaire/carte de crédit",
"Payment Type": "Type de paiement",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Date de paiement",
"Memo (Private Note)": "Mémo (note privée)",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'attente (en secondes)",
"The document number (DocNumber) of the invoice to search for.": "Le numéro de document (DocNumber) de la facture à rechercher.",
"The display name of the customer to search for.": "Le nom d'affichage du client à rechercher.",
"The ID of the customer to find payments for.": "L'ID du client pour lequel trouver des paiements.",
"Line items for the invoice": "Articles de la ligne pour la facture",
"Specify whether the invoice should be emailed after creation.": "Indique si la facture doit être envoyée par e-mail après la création.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Adresse e-mail à laquelle envoyer la facture. Requis si le statut de l'e-mail est \"Besoin d'être envoyé\". Remplace la valeur par défaut du client.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "La date à laquelle le paiement de la facture est dû. Si non fourni, le terme par défaut du client ou de la société est utilisé.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Numéro de référence optionnel pour la facture. Si non fourni, QuickBooks attribue le numéro séquentiel suivant.",
"The date entered on the transaction. Defaults to the current date if not specified.": "La date saisie sur l'opération. La date courante par défaut n'est pas spécifiée.",
"Note to self. Does not appear on the invoice sent to the customer.": "Note à soi. N'apparaît pas sur la facture envoyée au client.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Mémo à afficher sur la facture envoyée au client (apparaît sur le relevé).",
"The account from which the expense was paid.": "Le compte à partir duquel la dépense a été payée.",
"Optional - The vendor the expense was paid to.": "Optionnel - Le vendeur auquel la dépense a été payée.",
"The date the expense occurred.": "La date à laquelle la dépense s'est produite.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Les détails de la dépense (p. ex., catégories ou articles achetés). Au moins une ligne est requise.",
"Internal note about the expense.": "Note interne sur les dépenses.",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"Not Set (Default - No Email)": "Non défini (Par défaut - Pas d'e-mail)",
"Needs To Be Sent": "Doit être envoyé",
"Cash": "Espèces",
"Check": "Contrôler",
"Credit Card": "Carte de Crédit",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE",
"New Invoice": "Nouvelle facture",
"New Expense (Purchase)": "Nouvelles dépenses (Purchase)",
"New Customer": "Nouveau client",
"New Deposit": "Nouveau dépôt",
"New Transfer": "Nouveau transfert",
"Triggers when an invoice is created .": "Déclenche quand une facture est créée .",
"Triggers when an Expense (Purchase) is created.": "Déclenche quand une dépense (Purchase) est créée.",
"Triggers when a new customer is created.": "Déclenche lorsqu'un nouveau client est créé.",
"Triggers when a Deposit is created.": "Déclenche lorsqu'un dépôt est créé.",
"Triggers when a Transfer is created.": "Déclenche lorsqu'un transfert est créé."
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "会社ID",
"You can find Company ID under **settings->Additional Info**.": "会社IDは **settings->Additional Info** で確認できます。",
"Find Invoice": "請求書を検索",
"Find Customer": "顧客検索",
"Find Payment": "支払いを検索",
"Create Invoice": "請求書を作成",
"Create Expense": "支出を作成",
"Custom API Call": "カスタムAPI通話",
"Search for an invoice by its number in QuickBooks.": "QuickBooksの番号で請求書を検索します。",
"Search for a customer by display name in QuickBooks.": "QuickBooksのディスプレイ名で顧客を検索します。",
"Finds an existing payment in QuickBooks.": "QuickBooksの既存の支払いを検索します。",
"Creates an invoice in QuickBooks.": "QuickBooksで請求書を作成します。",
"Creates an expense transaction (purchase) in QuickBooks.": "QuickBooksで経費取引購入を作成します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Invoice Number": "請求書番号",
"Customer Name": "顧客名",
"Customer ID": "顧客 ID",
"Customer": "顧客",
"Line Items": "行の項目",
"Email Status": "Email Status",
"Billing Email Address": "請求先メールアドレス",
"Due Date": "締切日",
"Transaction Date": "取引日",
"Private Note (Memo)": "プライベートメモ(メモ)",
"Customer Memo (Statement Memo)": "Customer Memo (Statement Memo)",
"Bank/Credit Card Account": "銀行/クレジットカードアカウント",
"Payment Type": "支払いタイプ",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "支払日",
"Memo (Private Note)": "メモ (プライベートノート)",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The document number (DocNumber) of the invoice to search for.": "検索する請求書のドキュメント番号 (DocNumber)",
"The display name of the customer to search for.": "検索する顧客の表示名",
"The ID of the customer to find payments for.": "支払いを見つけるための顧客ID。",
"Line items for the invoice": "請求書の行項目",
"Specify whether the invoice should be emailed after creation.": "作成後に請求書を電子メールで送信するかどうかを指定します。",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "請求書を送信するメールアドレスです。メールステータスが「送信済み」の場合に必要です。顧客のデフォルトを上書きします。",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "請求書の支払い期限の日付。指定されていない場合は、顧客または会社からのデフォルトの期間が使用されます。",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "請求書のオプションの参照番号。指定されていない場合、QuickBooksは次の連続番号を割り当てます。",
"The date entered on the transaction. Defaults to the current date if not specified.": "The date entered on the transaction. Defaults to the current date if not specified.",
"Note to self. Does not appear on the invoice sent to the customer.": "顧客に送信された請求書には表示されません。",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "顧客に送信された請求書にメモを表示します (ステートメントに表示されます)。",
"The account from which the expense was paid.": "費用が支払われた口座。",
"Optional - The vendor the expense was paid to.": "オプション - 費用が支払われたベンダー。",
"The date the expense occurred.": "費用が発生した日付。",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "費用の詳細カテゴリまたは商品の購入。少なくとも1行以上が必要です。",
"Internal note about the expense.": "費用についての内部メモ。",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"Not Set (Default - No Email)": "設定されていません (デフォルト - メールはありません)",
"Needs To Be Sent": "送信が必要",
"Cash": "現金",
"Check": "チェック",
"Credit Card": "クレジットカード",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Invoice": "新しい請求書",
"New Expense (Purchase)": "新しい支出(購入)",
"New Customer": "新規顧客",
"New Deposit": "新規デポジット数",
"New Transfer": "新しい送金",
"Triggers when an invoice is created .": "請求書が作成されたときにトリガーされます。",
"Triggers when an Expense (Purchase) is created.": "経費(Purchase)が作成されたときにトリガーします。",
"Triggers when a new customer is created.": "新しい顧客が作成されたときにトリガーします.",
"Triggers when a Deposit is created.": "デポジットが作成されたときにトリガーします。",
"Triggers when a Transfer is created.": "転送が作成されたときにトリガーします。"
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "Bedrijf ID",
"You can find Company ID under **settings->Additional Info**.": "U kunt het Bedrijfs-ID vinden onder **instellingen>Aanvullende informatie**.",
"Find Invoice": "Factuur zoeken",
"Find Customer": "Klant zoeken",
"Find Payment": "Betaling zoeken",
"Create Invoice": "Factuur aanmaken",
"Create Expense": "Kosten aanmaken",
"Custom API Call": "Custom API Call",
"Search for an invoice by its number in QuickBooks.": "Zoek naar een factuur volgens het nummer in QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Zoek naar een klant op weergave naam in QuickBooks.",
"Finds an existing payment in QuickBooks.": "Vindt een bestaande betaling in QuickBooks.",
"Creates an invoice in QuickBooks.": "Maakt een factuur in QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Maakt een uitgave transactie aan (aankoop) in QuickBooks.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Invoice Number": "Factuur Nummer",
"Customer Name": "Klant naam",
"Customer ID": "Klant ID",
"Customer": "Klant",
"Line Items": "Posities regel",
"Email Status": "Email Status",
"Billing Email Address": "E-mailadres voor facturering",
"Due Date": "Inleverdatum",
"Transaction Date": "Transactie datum",
"Private Note (Memo)": "Privénotitie (Notitie)",
"Customer Memo (Statement Memo)": "Klant Memo (declaratie memo)",
"Bank/Credit Card Account": "Bank/creditcard rekening",
"Payment Type": "Betalings Type",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Datum betaling",
"Memo (Private Note)": "Memo (Private Notitie)",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"The document number (DocNumber) of the invoice to search for.": "Het documentnummer (DocNumber) van de te zoeken factuur",
"The display name of the customer to search for.": "De weergavenaam van de klant om naar te zoeken",
"The ID of the customer to find payments for.": "Het ID van de klant om betalingen voor te vinden.",
"Line items for the invoice": "Posities voor de factuur",
"Specify whether the invoice should be emailed after creation.": "Specificeer of de factuur gemaild moet worden na creatie.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "E-mailadres om de factuur naar te verzenden. Vereist als E-mail Status is \"Moet worden verzonden\". Overschrijft de klant standaard.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "De datum waarop de betaling voor de factuur is gedaan. Indien niet opgegeven, wordt de standaard termijn van klant of bedrijf gebruikt.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Optionele referentienummer voor de factuur. Indien niet opgegeven, QuickBooks wijst het volgende opeenvolgende aantal toe.",
"The date entered on the transaction. Defaults to the current date if not specified.": "De datum die is ingevoerd op de transactie. Standaard de huidige datum als deze niet is opgegeven.",
"Note to self. Does not appear on the invoice sent to the customer.": "Opmerking voor zichzelf. Wordt niet weergegeven op de factuur die naar de klant is verzonden.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Notitie om te worden getoond op de naar de klant verzonden factuur (verschijnt op de verklaring).",
"The account from which the expense was paid.": "De rekening waarvan de uitgave is betaald.",
"Optional - The vendor the expense was paid to.": "Optioneel - De verkoper waar de uitgave betaald werd.",
"The date the expense occurred.": "De datum waarop de uitgave heeft plaatsgevonden.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Details van de uitgave (bv. categorieën of items gekocht). Ten minste één regel is vereist.",
"Internal note about the expense.": "Interne notitie over de kosten.",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"Not Set (Default - No Email)": "Niet ingesteld (standaard - Geen E-mail)",
"Needs To Be Sent": "Moet verzonden worden",
"Cash": "Contant",
"Check": "Controleer",
"Credit Card": "Creditcard",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Invoice": "Nieuwe factuur",
"New Expense (Purchase)": "Nieuwe kosten (Purchase)",
"New Customer": "Nieuwe klant",
"New Deposit": "Nieuwe storting",
"New Transfer": "Nieuwe overschrijving",
"Triggers when an invoice is created .": "Triggert wanneer een factuur is aangemaakt.",
"Triggers when an Expense (Purchase) is created.": "Triggert wanneer een uitgave (Purchase) is aangemaakt.",
"Triggers when a new customer is created.": "Triggert wanneer een nieuwe klant wordt aangemaakt.",
"Triggers when a Deposit is created.": "Triggert wanneer een storting is aangemaakt.",
"Triggers when a Transfer is created.": "Triggert wanneer een Transfer is aangemaakt."
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "ID da Empresa",
"You can find Company ID under **settings->Additional Info**.": "Você pode encontrar o ID da empresa em **configurações->Informações adicionais**.",
"Find Invoice": "Encontrar fatura",
"Find Customer": "Encontrar o cliente",
"Find Payment": "Encontrar pagamento",
"Create Invoice": "Criar fatura",
"Create Expense": "Criar Despesa",
"Custom API Call": "Chamada de API personalizada",
"Search for an invoice by its number in QuickBooks.": "Pesquisar uma fatura por seu número no QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Procure um cliente por nome de exibição no QuickBooks.",
"Finds an existing payment in QuickBooks.": "Encontrar um pagamento existente no QuickBooks.",
"Creates an invoice in QuickBooks.": "Cria uma fatura em QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Cria uma transação de despesa (compra) no QuickBooks.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Invoice Number": "Número da fatura",
"Customer Name": "Nome do cliente",
"Customer ID": "ID do cliente",
"Customer": "Cliente",
"Line Items": "Itens da linha",
"Email Status": "Email Status",
"Billing Email Address": "Endereço de Cobrança",
"Due Date": "Data de vencimento",
"Transaction Date": "Data da transação",
"Private Note (Memo)": "Nota Privada (Memo)",
"Customer Memo (Statement Memo)": "Memorando do cliente (declaração emo)",
"Bank/Credit Card Account": "Conta Banco/Cartão de Crédito",
"Payment Type": "Tipo de Pagamento",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Data do pagamento",
"Memo (Private Note)": "Memo (Nota Privada)",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"The document number (DocNumber) of the invoice to search for.": "O número do documento (DocNumber) da fatura a ser pesquisada.",
"The display name of the customer to search for.": "O nome de exibição do cliente a procurar",
"The ID of the customer to find payments for.": "O ID do cliente para encontrar os pagamentos.",
"Line items for the invoice": "Itens de linha para a fatura",
"Specify whether the invoice should be emailed after creation.": "Especifique se a fatura deve ser enviada por e-mail após a criação.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Endereço de e-mail para enviar a fatura. Obrigatório se o status do e-mail for \"Precisa ser enviado\". Substitui o padrão do cliente.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "A data de vencimento do pagamento da fatura. Se não for fornecido, será usado o termo padrão do cliente ou da empresa.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Número de referência opcional para a fatura. Se não fornecido, QuickBooks atribui o próximo número sequencial.",
"The date entered on the transaction. Defaults to the current date if not specified.": "A data inserida na transação. O padrão é a data atual se não for especificado.",
"Note to self. Does not appear on the invoice sent to the customer.": "Nota para si mesmo. Não aparece na fatura enviada ao cliente.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "O memorando a ser exibido na fatura enviada ao cliente (aparece na declaração).",
"The account from which the expense was paid.": "A conta a partir da qual a despesa foi paga.",
"Optional - The vendor the expense was paid to.": "Opcional - O fornecedor para o qual a despesa foi paga.",
"The date the expense occurred.": "A data em que ocorreu a despesa.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Detalhes da despesa (por exemplo, categorias ou itens comprados). Pelo menos uma linha é necessária.",
"Internal note about the expense.": "Nota interna sobre a despesa.",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"Not Set (Default - No Email)": "Não definido (padrão - Sem e-mail)",
"Needs To Be Sent": "Precisa ser enviado",
"Cash": "Dinheiro",
"Check": "Verificar",
"Credit Card": "Cartão de Crédito",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Invoice": "Nova fatura",
"New Expense (Purchase)": "Nova Despesa (Purchase)",
"New Customer": "Novo Cliente",
"New Deposit": "Novo Depósito",
"New Transfer": "Nova Transferência",
"Triggers when an invoice is created .": "Aciona quando uma fatura é criada.",
"Triggers when an Expense (Purchase) is created.": "Aciona quando uma despesa (Purchase) é criada.",
"Triggers when a new customer is created.": "Dispara quando um novo cliente é criado.",
"Triggers when a Deposit is created.": "Dispara quando um depósito é criado.",
"Triggers when a Transfer is created.": "Dispara quando uma transferência é criada."
}

View File

@@ -0,0 +1,77 @@
{
"Quickbooks Online": "С quickbooks онлайн",
"Company ID": "ID Компании",
"You can find Company ID under **settings->Additional Info**.": "Вы можете найти ID компании в разделе **settings->Дополнительная информация**.",
"Find Invoice": "Найти счет",
"Find Customer": "Найти клиента",
"Find Payment": "Найти платеж",
"Create Invoice": "Создать счет",
"Create Expense": "Создать расход",
"Custom API Call": "Пользовательский вызов API",
"Search for an invoice by its number in QuickBooks.": "Поиск счета по его количеству в quickbooks",
"Search for a customer by display name in QuickBooks.": "Поиск клиента по имени в quickbooks",
"Finds an existing payment in QuickBooks.": "Находит существующий платеж в quickbooks",
"Creates an invoice in QuickBooks.": "Создает счет в quickbooks",
"Creates an expense transaction (purchase) in QuickBooks.": "Создает транзакцию расходов (покупки) в quickbooks .",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Invoice Number": "Номер счёта",
"Customer Name": "Имя клиента",
"Customer ID": "ID клиента",
"Customer": "Покупатель",
"Line Items": "Позиции",
"Email Status": "Email Status",
"Billing Email Address": "Адрес электронной почты для выставления счетов",
"Due Date": "Срок сдачи",
"Transaction Date": "Дата транзакции",
"Private Note (Memo)": "Приватная заметка (Memo)",
"Customer Memo (Statement Memo)": "Запоминание о клиенте (Statement Memo)",
"Bank/Credit Card Account": "Банковский/кредитный счет",
"Payment Type": "Тип платежа",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Дата оплаты",
"Memo (Private Note)": "Заметка (личная заметка)",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"The document number (DocNumber) of the invoice to search for.": "Номер документа (DocNumber) счета-фактуры для поиска.",
"The display name of the customer to search for.": "Отображаемое имя клиента для поиска.",
"The ID of the customer to find payments for.": "ID клиента для поиска платежей.",
"Line items for the invoice": "Позиции для счета-фактуры",
"Specify whether the invoice should be emailed after creation.": "Укажите, должен ли счет быть отправлен по электронной почте после создания.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Адрес эл. почты для отправки счета. Обязательно, если статус эл. почты \"Должен быть отправлен\". Переопределяет клиента по умолчанию.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "Дата, когда причитается оплата за счет. Если не указано, используется срок по умолчанию от клиента или компании.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Необязательный номер счёта. Если он не указан, QuickBooks назначает следующий порядковый номер.",
"The date entered on the transaction. Defaults to the current date if not specified.": "Дата введенная в транзакции. По умолчанию текущая дата, если не указана.",
"Note to self. Does not appear on the invoice sent to the customer.": "Примечание для себя. Не появляется в счете, отправленном клиенту.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Примечание, отображаемое в счете, отправленном клиенту (отображается в выписке).",
"The account from which the expense was paid.": "Счет, с которого были оплачены расходы.",
"Optional - The vendor the expense was paid to.": "Необязательный - Продавец был оплачен.",
"The date the expense occurred.": "Дата совершения расхода.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Детали расходов (например, категории или товары). Требуется хотя бы одна строка.",
"Internal note about the expense.": "Внутренняя заметка о расходе.",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"Not Set (Default - No Email)": "Не установлено (по умолчанию - нет Email)",
"Needs To Be Sent": "Нужно отправить",
"Cash": "Наличные",
"Check": "Проверить",
"Credit Card": "Кредитная карта",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Invoice": "Новый счет",
"New Expense (Purchase)": "Новые расходы (покупки)",
"New Customer": "Новый клиент",
"New Deposit": "Новый депозит",
"New Transfer": "Новый перевод",
"Triggers when an invoice is created .": "Включает при создании счета-фактуры .",
"Triggers when an Expense (Purchase) is created.": "Триггеры при оплате (покупке).",
"Triggers when a new customer is created.": "Триггеры при создании нового клиента.",
"Triggers when a Deposit is created.": "Триггеры при внесении депозита.",
"Triggers when a Transfer is created.": "Триггеры при создании перевода."
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "Company ID",
"You can find Company ID under **settings->Additional Info**.": "You can find Company ID under **settings->Additional Info**.",
"Find Invoice": "Find Invoice",
"Find Customer": "Find Customer",
"Find Payment": "Find Payment",
"Create Invoice": "Create Invoice",
"Create Expense": "Create Expense",
"Custom API Call": "Custom API Call",
"Search for an invoice by its number in QuickBooks.": "Search for an invoice by its number in QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Search for a customer by display name in QuickBooks.",
"Finds an existing payment in QuickBooks.": "Finds an existing payment in QuickBooks.",
"Creates an invoice in QuickBooks.": "Creates an invoice in QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Creates an expense transaction (purchase) in QuickBooks.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Invoice Number": "Invoice Number",
"Customer Name": "Customer Name",
"Customer ID": "Customer ID",
"Customer": "Customer",
"Line Items": "Line Items",
"Email Status": "Email Status",
"Billing Email Address": "Billing Email Address",
"Due Date": "Due Date",
"Transaction Date": "Transaction Date",
"Private Note (Memo)": "Private Note (Memo)",
"Customer Memo (Statement Memo)": "Customer Memo (Statement Memo)",
"Bank/Credit Card Account": "Bank/Credit Card Account",
"Payment Type": "Payment Type",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Payment Date",
"Memo (Private Note)": "Memo (Private Note)",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The document number (DocNumber) of the invoice to search for.": "The document number (DocNumber) of the invoice to search for.",
"The display name of the customer to search for.": "The display name of the customer to search for.",
"The ID of the customer to find payments for.": "The ID of the customer to find payments for.",
"Line items for the invoice": "Line items for the invoice",
"Specify whether the invoice should be emailed after creation.": "Specify whether the invoice should be emailed after creation.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "The date when the payment for the invoice is due. If not provided, default term from customer or company is used.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.",
"The date entered on the transaction. Defaults to the current date if not specified.": "The date entered on the transaction. Defaults to the current date if not specified.",
"Note to self. Does not appear on the invoice sent to the customer.": "Note to self. Does not appear on the invoice sent to the customer.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Memo to be displayed on the invoice sent to the customer (appears on statement).",
"The account from which the expense was paid.": "The account from which the expense was paid.",
"Optional - The vendor the expense was paid to.": "Optional - The vendor the expense was paid to.",
"The date the expense occurred.": "The date the expense occurred.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Details of the expense (e.g., categories or items purchased). At least one line is required.",
"Internal note about the expense.": "Internal note about the expense.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Not Set (Default - No Email)": "Not Set (Default - No Email)",
"Needs To Be Sent": "Needs To Be Sent",
"Cash": "Cash",
"Check": "Check",
"Credit Card": "Credit Card",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Invoice": "New Invoice",
"New Expense (Purchase)": "New Expense (Purchase)",
"New Customer": "New Customer",
"New Deposit": "New Deposit",
"New Transfer": "New Transfer",
"Triggers when an invoice is created .": "Triggers when an invoice is created .",
"Triggers when an Expense (Purchase) is created.": "Triggers when an Expense (Purchase) is created.",
"Triggers when a new customer is created.": "Triggers when a new customer is created.",
"Triggers when a Deposit is created.": "Triggers when a Deposit is created.",
"Triggers when a Transfer is created.": "Triggers when a Transfer is created."
}

View File

@@ -0,0 +1,77 @@
{
"Quickbooks Online": "Quickbooks Online",
"Company ID": "Company ID",
"You can find Company ID under **settings->Additional Info**.": "You can find Company ID under **settings->Additional Info**.",
"Find Invoice": "Find Invoice",
"Find Customer": "Find Customer",
"Find Payment": "Find Payment",
"Create Invoice": "Create Invoice",
"Create Expense": "Create Expense",
"Custom API Call": "Custom API Call",
"Search for an invoice by its number in QuickBooks.": "Search for an invoice by its number in QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Search for a customer by display name in QuickBooks.",
"Finds an existing payment in QuickBooks.": "Finds an existing payment in QuickBooks.",
"Creates an invoice in QuickBooks.": "Creates an invoice in QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Creates an expense transaction (purchase) in QuickBooks.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Invoice Number": "Invoice Number",
"Customer Name": "Customer Name",
"Customer ID": "Customer ID",
"Customer": "Customer",
"Line Items": "Line Items",
"Email Status": "Email Status",
"Billing Email Address": "Billing Email Address",
"Due Date": "Due Date",
"Transaction Date": "Transaction Date",
"Private Note (Memo)": "Private Note (Memo)",
"Customer Memo (Statement Memo)": "Customer Memo (Statement Memo)",
"Bank/Credit Card Account": "Bank/Credit Card Account",
"Payment Type": "Payment Type",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Payment Date",
"Memo (Private Note)": "Memo (Private Note)",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The document number (DocNumber) of the invoice to search for.": "The document number (DocNumber) of the invoice to search for.",
"The display name of the customer to search for.": "The display name of the customer to search for.",
"The ID of the customer to find payments for.": "The ID of the customer to find payments for.",
"Line items for the invoice": "Line items for the invoice",
"Specify whether the invoice should be emailed after creation.": "Specify whether the invoice should be emailed after creation.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "The date when the payment for the invoice is due. If not provided, default term from customer or company is used.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.",
"The date entered on the transaction. Defaults to the current date if not specified.": "The date entered on the transaction. Defaults to the current date if not specified.",
"Note to self. Does not appear on the invoice sent to the customer.": "Note to self. Does not appear on the invoice sent to the customer.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Memo to be displayed on the invoice sent to the customer (appears on statement).",
"The account from which the expense was paid.": "The account from which the expense was paid.",
"Optional - The vendor the expense was paid to.": "Optional - The vendor the expense was paid to.",
"The date the expense occurred.": "The date the expense occurred.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Details of the expense (e.g., categories or items purchased). At least one line is required.",
"Internal note about the expense.": "Internal note about the expense.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Not Set (Default - No Email)": "Not Set (Default - No Email)",
"Needs To Be Sent": "Needs To Be Sent",
"Cash": "Cash",
"Check": "Check",
"Credit Card": "Credit Card",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Invoice": "New Invoice",
"New Expense (Purchase)": "New Expense (Purchase)",
"New Customer": "New Customer",
"New Deposit": "New Deposit",
"New Transfer": "New Transfer",
"Triggers when an invoice is created .": "Triggers when an invoice is created .",
"Triggers when an Expense (Purchase) is created.": "Triggers when an Expense (Purchase) is created.",
"Triggers when a new customer is created.": "Triggers when a new customer is created.",
"Triggers when a Deposit is created.": "Triggers when a Deposit is created.",
"Triggers when a Transfer is created.": "Triggers when a Transfer is created."
}

View File

@@ -0,0 +1,78 @@
{
"Company ID": "Company ID",
"You can find Company ID under **settings->Additional Info**.": "You can find Company ID under **settings->Additional Info**.",
"Find Invoice": "Find Invoice",
"Find Customer": "Find Customer",
"Find Payment": "Find Payment",
"Create Invoice": "Create Invoice",
"Create Expense": "Create Expense",
"Custom API Call": "自定义 API 呼叫",
"Search for an invoice by its number in QuickBooks.": "Search for an invoice by its number in QuickBooks.",
"Search for a customer by display name in QuickBooks.": "Search for a customer by display name in QuickBooks.",
"Finds an existing payment in QuickBooks.": "Finds an existing payment in QuickBooks.",
"Creates an invoice in QuickBooks.": "Creates an invoice in QuickBooks.",
"Creates an expense transaction (purchase) in QuickBooks.": "Creates an expense transaction (purchase) in QuickBooks.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Invoice Number": "Invoice Number",
"Customer Name": "Customer Name",
"Customer ID": "Customer ID",
"Customer": "Customer",
"Line Items": "Line Items",
"Email Status": "Email Status",
"Billing Email Address": "Billing Email Address",
"Due Date": "Due Date",
"Transaction Date": "Transaction Date",
"Private Note (Memo)": "Private Note (Memo)",
"Customer Memo (Statement Memo)": "Customer Memo (Statement Memo)",
"Bank/Credit Card Account": "Bank/Credit Card Account",
"Payment Type": "Payment Type",
"Payee (Vendor)": "Payee (Vendor)",
"Payment Date": "Payment Date",
"Memo (Private Note)": "Memo (Private Note)",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The document number (DocNumber) of the invoice to search for.": "The document number (DocNumber) of the invoice to search for.",
"The display name of the customer to search for.": "The display name of the customer to search for.",
"The ID of the customer to find payments for.": "The ID of the customer to find payments for.",
"Line items for the invoice": "Line items for the invoice",
"Specify whether the invoice should be emailed after creation.": "Specify whether the invoice should be emailed after creation.",
"Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.": "Email address to send the invoice to. Required if Email Status is \"Needs To Be Sent\". Overrides customer default.",
"The date when the payment for the invoice is due. If not provided, default term from customer or company is used.": "The date when the payment for the invoice is due. If not provided, default term from customer or company is used.",
"Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.": "Optional reference number for the invoice. If not provided, QuickBooks assigns the next sequential number.",
"The date entered on the transaction. Defaults to the current date if not specified.": "The date entered on the transaction. Defaults to the current date if not specified.",
"Note to self. Does not appear on the invoice sent to the customer.": "Note to self. Does not appear on the invoice sent to the customer.",
"Memo to be displayed on the invoice sent to the customer (appears on statement).": "Memo to be displayed on the invoice sent to the customer (appears on statement).",
"The account from which the expense was paid.": "The account from which the expense was paid.",
"Optional - The vendor the expense was paid to.": "Optional - The vendor the expense was paid to.",
"The date the expense occurred.": "The date the expense occurred.",
"Details of the expense (e.g., categories or items purchased). At least one line is required.": "Details of the expense (e.g., categories or items purchased). At least one line is required.",
"Internal note about the expense.": "Internal note about the expense.",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Not Set (Default - No Email)": "Not Set (Default - No Email)",
"Needs To Be Sent": "Needs To Be Sent",
"Cash": "Cash",
"Check": "Check",
"Credit Card": "Credit Card",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Invoice": "New Invoice",
"New Expense (Purchase)": "New Expense (Purchase)",
"New Customer": "New Customer",
"New Deposit": "New Deposit",
"New Transfer": "New Transfer",
"Triggers when an invoice is created .": "Triggers when an invoice is created .",
"Triggers when an Expense (Purchase) is created.": "Triggers when an Expense (Purchase) is created.",
"Triggers when a new customer is created.": "Triggers when a new customer is created.",
"Triggers when a Deposit is created.": "Triggers when a Deposit is created.",
"Triggers when a Transfer is created.": "Triggers when a Transfer is created."
}

View File

@@ -0,0 +1,66 @@
import { createPiece, OAuth2PropertyValue, PieceAuth, PiecePropValueSchema, Property } from "@activepieces/pieces-framework";
import { findInvoiceAction } from "./actions/find-invoice";
import { findCustomerAction } from "./actions/find-customer";
import { findPaymentAction } from "./actions/find-payment";
import { createInvoiceAction } from "./actions/create-invoice";
import { createExpenseAction } from "./actions/create-expense";
import { newInvoice } from "./triggers/new-invoice";
import { newExpense } from "./triggers/new-expense";
import { newCustomer } from "./triggers/new-customer";
import { newDeposit } from "./triggers/new-deposit";
import { newTransfer } from "./triggers/new-transfer";
import { createCustomApiCallAction } from "@activepieces/pieces-common";
import { quickbooksCommon } from "./lib/common";
export const quickbooksAuth = PieceAuth.OAuth2({
description: 'You can find Company ID under **settings->Additional Info**.',
required: true,
props: {
companyId: Property.ShortText({
displayName: 'Company ID',
required: true,
}) },
authUrl: 'https://appcenter.intuit.com/connect/oauth2',
tokenUrl: 'https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer',
scope: ['com.intuit.quickbooks.accounting'],
});
export const quickbooks = createPiece({
displayName: "Quickbooks Online",
auth: quickbooksAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: "https://cdn.activepieces.com/pieces/quickbooks.png",
authors: [
'onyedikachi-david'
],
actions: [
findInvoiceAction,
findCustomerAction,
findPaymentAction,
createInvoiceAction,
createExpenseAction,
createCustomApiCallAction({
auth:quickbooksAuth,
baseUrl:(auth)=>{
const authValue = auth as PiecePropValueSchema<typeof quickbooksAuth>;
const companyId = authValue.props?.['companyId'];
const apiUrl = quickbooksCommon.getApiUrl(companyId);
return apiUrl
},
authMapping:async (auth)=>{
return {
Authorization:`Bearer ${(auth as OAuth2PropertyValue).access_token}`
}
}
})
],
triggers: [
newInvoice,
newExpense,
newCustomer,
newDeposit,
newTransfer
],
});

View File

@@ -0,0 +1,28 @@
const QUICKBOOKS_API_URL_SANDBOX = 'https://sandbox-quickbooks.api.intuit.com/v3/company';
const QUICKBOOKS_API_URL_PRODUCTION = 'https://quickbooks.api.intuit.com/v3/company';
export const quickbooksCommon = {
getApiUrl: (realmId: string) => {
const baseUrl = QUICKBOOKS_API_URL_PRODUCTION;
return `${baseUrl}/${realmId}`;
},
};
export interface QuickbooksEntityResponse<T> {
QueryResponse?: {
startPosition?: number;
maxResults?: number;
totalCount?: number;
} & {
[key: string]: T[] | undefined;
};
Fault?: {
Error: {
Message: string;
Detail?: string;
code: string;
}[];
type: string;
};
time?: string;
}

View File

@@ -0,0 +1,290 @@
export interface QuickbooksRef {
value: string;
name?: string; // Optional based on context
}
export interface QuickbooksAddress {
Id?: string;
Line1?: string;
City?: string;
CountrySubDivisionCode?: string;
PostalCode?: string;
Lat?: string;
Long?: string;
}
export interface QuickbooksEmail {
Address?: string;
}
export interface QuickbooksWebsite {
URI?: string;
}
export interface QuickbooksPhoneNumber {
FreeFormNumber?: string;
}
export interface QuickbooksCurrencyRef {
value: string;
name?: string;
}
export interface QuickbooksMetaData {
CreateTime?: string;
LastUpdatedTime?: string;
}
export interface QuickbooksCustomField {
DefinitionId: string;
Name?: string;
Type: 'BooleanType' | 'DateType' | 'NumberType' | 'StringType';
StringValue?: string;
BooleanValue?: boolean;
DateValue?: string; // YYYY-MM-DD
NumberValue?: number;
}
export interface QuickbooksCustomer {
Id: string;
SyncToken?: string;
MetaData?: QuickbooksMetaData;
GivenName?: string;
FamilyName?: string;
FullyQualifiedName?: string;
CompanyName?: string;
DisplayName: string;
PrintOnCheckName?: string;
Active?: boolean;
PrimaryPhone?: QuickbooksPhoneNumber;
PrimaryEmailAddr?: QuickbooksEmail;
WebAddr?: QuickbooksWebsite;
BillAddr?: QuickbooksAddress;
ShipAddr?: QuickbooksAddress;
Job?: boolean;
BillWithParent?: boolean;
ParentRef?: QuickbooksRef;
Level?: number;
SalesTermRef?: QuickbooksRef;
PaymentMethodRef?: QuickbooksRef;
Balance?: number;
OpenBalanceDate?: string;
BalanceWithJobs?: number;
CurrencyRef?: QuickbooksCurrencyRef;
PreferredDeliveryMethod?: string;
Taxable?: boolean;
TaxExemptionReasonId?: QuickbooksRef;
DefaultTaxCodeRef?: QuickbooksRef;
Notes?: string;
domain?: string;
sparse?: boolean;
}
export interface QuickbooksInvoice {
Id: string;
SyncToken?: string;
MetaData?: QuickbooksMetaData;
CustomField?: QuickbooksCustomField[];
DocNumber?: string;
TxnDate?: string;
CurrencyRef?: QuickbooksCurrencyRef;
LinkedTxn?: any[];
Line: QuickbooksInvoiceLine[];
TxnTaxDetail?: { TotalTax?: number; TaxLine?: any[]; };
CustomerRef: QuickbooksRef;
CustomerMemo?: { value: string };
BillAddr?: QuickbooksAddress;
ShipAddr?: QuickbooksAddress;
SalesTermRef?: QuickbooksRef;
DueDate?: string;
TotalAmt: number;
ApplyTaxAfterDiscount?: boolean;
PrintStatus?: string;
EmailStatus?: string;
BillEmail?: QuickbooksEmail;
Balance: number;
Deposit?: number;
AllowIPNPayment?: boolean;
AllowOnlinePayment?: boolean;
AllowOnlineCreditCardPayment?: boolean;
AllowOnlineACHPayment?: boolean;
domain?: string;
sparse?: boolean;
PrivateNote?: string;
ProjectRef?: QuickbooksRef;
}
export interface QuickbooksInvoiceLine {
Id?: string;
LineNum?: number;
Description?: string;
Amount: number;
LinkedTxn?: any[];
DetailType: 'SalesItemLineDetail' | 'GroupLineDetail' | 'DescriptionOnly' | 'DiscountLineDetail' | 'SubTotalLineDetail';
SalesItemLineDetail?: {
ItemRef: QuickbooksRef;
UnitPrice?: number;
Qty?: number;
TaxCodeRef?: QuickbooksRef;
};
DiscountLineDetail?: {
PercentBased?: boolean;
DiscountPercent?: number;
DiscountAccountRef?: QuickbooksRef;
};
SubTotalLineDetail?: Record<string, never>;
DescriptionOnly?: Record<string, never>;
}
export interface QuickbooksItem {
Id: string;
Name: string;
Description?: string;
Active?: boolean;
FullyQualifiedName?: string;
Taxable?: boolean;
UnitPrice?: number;
Type: 'Inventory' | 'NonInventory' | 'Service' | 'Category' | 'Bundle';
IncomeAccountRef?: QuickbooksRef;
PurchaseDesc?: string;
PurchaseCost?: number;
ExpenseAccountRef?: QuickbooksRef;
AssetAccountRef?: QuickbooksRef; // For Inventory type
TrackQtyOnHand?: boolean; // For Inventory type
QtyOnHand?: number; // For Inventory type
InvStartDate?: string; // For Inventory type
SubItem?: boolean;
ParentRef?: QuickbooksRef;
Level?: number;
TaxClassificationRef?: QuickbooksRef;
domain?: string;
sparse?: boolean;
MetaData?: QuickbooksMetaData;
}
export interface QuickbooksAccount {
Id: string;
Name: string;
AccountType: string; // e.g., 'Bank', 'Credit Card', 'Accounts Receivable', 'Expense', 'Income'
AccountSubType?: string;
Classification?: string; // e.g., 'Asset', 'Liability', 'Equity', 'Revenue', 'Expense'
Active?: boolean;
CurrencyRef?: QuickbooksCurrencyRef;
CurrentBalance?: number;
domain?: string;
sparse?: boolean;
MetaData?: QuickbooksMetaData;
}
export interface QuickbooksVendor {
Id: string;
SyncToken?: string;
DisplayName: string;
CompanyName?: string;
PrintOnCheckName?: string;
Active?: boolean;
PrimaryPhone?: QuickbooksPhoneNumber;
PrimaryEmailAddr?: QuickbooksEmail;
WebAddr?: QuickbooksWebsite;
BillAddr?: QuickbooksAddress;
Balance?: number;
CurrencyRef?: QuickbooksCurrencyRef;
Vendor1099?: boolean;
TaxIdentifier?: string;
TermRef?: QuickbooksRef;
domain?: string;
sparse?: boolean;
MetaData?: QuickbooksMetaData;
}
export interface QuickbooksPurchase {
Id?: string;
SyncToken?: string;
MetaData?: QuickbooksMetaData;
DocNumber?: string;
TxnDate?: string;
CurrencyRef?: QuickbooksCurrencyRef;
PrivateNote?: string;
Line: QuickbooksPurchaseLine[];
AccountRef: QuickbooksRef; // Account money came from (Bank/CC)
EntityRef?: QuickbooksRef; // Payee (Vendor)
PaymentType: 'Cash' | 'Check' | 'CreditCard';
TotalAmt: number;
PrintStatus?: string;
ExchangeRate?: number;
GlobalTaxCalculation?: string;
TransactionLocationType?: string;
Credit?: boolean; // Specifies if this is a vendor credit
domain?: string;
sparse?: boolean;
}
export interface QuickbooksPurchaseLine {
Id?: string;
LineNum?: number;
Description?: string;
Amount: number;
LinkedTxn?: any[];
DetailType: 'AccountBasedExpenseLineDetail' | 'ItemBasedExpenseLineDetail'; // Add others if needed
AccountBasedExpenseLineDetail?: {
AccountRef: QuickbooksRef; // Expense Account
BillableStatus?: string;
CustomerRef?: QuickbooksRef;
TaxCodeRef?: QuickbooksRef;
};
ItemBasedExpenseLineDetail?: {
ItemRef: QuickbooksRef;
Qty?: number;
UnitPrice?: number;
BillableStatus?: string;
CustomerRef?: QuickbooksRef;
TaxCodeRef?: QuickbooksRef;
};
// Add other detail types if needed
}
export interface QuickbooksEstimate {
Id: string;
SyncToken?: string;
MetaData?: QuickbooksMetaData;
CustomField?: QuickbooksCustomField[];
DocNumber?: string;
TxnDate?: string;
CurrencyRef?: QuickbooksCurrencyRef;
LinkedTxn?: any[];
Line: QuickbooksInvoiceLine[];
TxnTaxDetail?: {
TxnTaxCodeRef?: QuickbooksRef;
TotalTax?: number;
TaxLine?: {
DetailType: 'TaxLineDetail';
Amount?: number;
TaxLineDetail?: {
TaxRateRef?: QuickbooksRef;
PercentBased?: boolean;
TaxPercent?: number;
NetAmountTaxable?: number;
}
}[];
};
CustomerRef: QuickbooksRef;
CustomerMemo?: { value: string };
BillAddr?: QuickbooksAddress;
ShipAddr?: QuickbooksAddress;
SalesTermRef?: QuickbooksRef;
DueDate?: string;
TotalAmt?: number;
ApplyTaxAfterDiscount?: boolean;
PrintStatus?: string;
EmailStatus?: string;
BillEmail?: QuickbooksEmail;
AcceptedBy?: string;
AcceptedDate?: string;
ExpirationDate?: string;
TxnStatus?: string;
domain?: string;
sparse?: boolean;
PrivateNote?: string;
GlobalTaxCalculation?: string;
ProjectRef?: QuickbooksRef;
}

View File

@@ -0,0 +1,86 @@
import {
TriggerStrategy,
createTrigger,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import { quickbooksAuth } from '../index';
import {
DedupeStrategy,
httpClient,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
import dayjs from 'dayjs';
import { QuickbooksCustomer } from '../lib/types';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof quickbooksAuth>,
Record<string, unknown>
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, lastFetchEpochMS }) {
const { access_token } = auth;
const companyId = auth.props?.['companyId'] as string;
const apiUrl = quickbooksCommon.getApiUrl(companyId!);
const query =
lastFetchEpochMS === 0
? `SELECT * FROM Customer ORDERBY Metadata.CreateTime DESC MAXRESULTS 10`
: `SELECT * FROM Customer WHERE Metadata.CreateTime >= '${dayjs(
lastFetchEpochMS
).toISOString()}' ORDERBY Metadata.CreateTime DESC`;
const response = await httpClient.sendRequest<
QuickbooksEntityResponse<QuickbooksCustomer>
>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
const customers = response.body.QueryResponse?.['Customer'] ?? [];
return customers.map((customer) => ({
epochMilliSeconds: dayjs(customer.MetaData?.CreateTime).valueOf(),
data: customer,
}));
},
};
export const newCustomer = createTrigger({
auth: quickbooksAuth,
name: 'new_customer',
displayName: 'New Customer',
description: 'Triggers when a new customer is created.',
props: {},
type: TriggerStrategy.POLLING,
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
sampleData: undefined,
});

View File

@@ -0,0 +1,80 @@
import {
AppConnectionValueForAuthProperty,
PiecePropValueSchema,
TriggerStrategy,
createTrigger,
} from "@activepieces/pieces-framework";
import { quickbooksAuth } from '../index';
import { DedupeStrategy, httpClient, HttpMethod, Polling, pollingHelper } from "@activepieces/pieces-common";
import { quickbooksCommon, QuickbooksEntityResponse } from "../lib/common";
import { QuickbooksCustomer } from '../lib/types';
import dayjs from 'dayjs';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof quickbooksAuth>,
Record<string, unknown>
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, lastFetchEpochMS }) {
const { access_token } = auth;
const companyId = auth.props?.['companyId'] as string;
const apiUrl = quickbooksCommon.getApiUrl(companyId!);
const query =
lastFetchEpochMS === 0
? `SELECT * FROM Deposit ORDERBY Metadata.CreateTime DESC MAXRESULTS 10`
: `SELECT * FROM Deposit WHERE Metadata.CreateTime >= '${dayjs(
lastFetchEpochMS
).toISOString()}' ORDERBY Metadata.CreateTime DESC`;
const response = await httpClient.sendRequest<
QuickbooksEntityResponse<QuickbooksCustomer>
>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
const deposits = response.body.QueryResponse?.['Deposit'] ?? [];
return deposits.map((deposit) => ({
epochMilliSeconds: dayjs(deposit.MetaData?.CreateTime).valueOf(),
data: deposit,
}));
},
};
export const newDeposit = createTrigger({
auth: quickbooksAuth,
name: 'new_deposit',
displayName: 'New Deposit',
description: 'Triggers when a Deposit is created.',
props: {},
type: TriggerStrategy.POLLING,
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
sampleData: undefined,
});

View File

@@ -0,0 +1,86 @@
import {
TriggerStrategy,
createTrigger,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import { quickbooksAuth } from '../index';
import {
DedupeStrategy,
httpClient,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
import { QuickbooksPurchase } from '../lib/types';
import dayjs from 'dayjs';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof quickbooksAuth>,
Record<string, unknown>
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, lastFetchEpochMS }) {
const { access_token } = auth;
const companyId = auth.props?.['companyId'] as string;
const apiUrl = quickbooksCommon.getApiUrl(companyId!);
const query =
lastFetchEpochMS === 0
? `SELECT * FROM Purchase ORDERBY Metadata.CreateTime DESC MAXRESULTS 10`
: `SELECT * FROM Purchase WHERE Metadata.CreateTime >= '${dayjs(
lastFetchEpochMS
).toISOString()}' ORDERBY Metadata.CreateTime DESC`;
const response = await httpClient.sendRequest<
QuickbooksEntityResponse<QuickbooksPurchase>
>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
const purchases = response.body.QueryResponse?.['Purchase'] ?? [];
return purchases.map((purchase) => ({
epochMilliSeconds: dayjs(purchase.MetaData?.CreateTime).valueOf(),
data: purchase,
}));
},
};
export const newExpense = createTrigger({
auth: quickbooksAuth,
name: 'new_expense',
displayName: 'New Expense (Purchase)',
description: 'Triggers when an Expense (Purchase) is created.',
props: {},
type: TriggerStrategy.POLLING,
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
sampleData: undefined,
});

View File

@@ -0,0 +1,86 @@
import {
TriggerStrategy,
createTrigger,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import { quickbooksAuth } from '../index';
import {
DedupeStrategy,
httpClient,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
import dayjs from 'dayjs';
import { QuickbooksInvoice } from '../lib/types';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof quickbooksAuth>,
Record<string, unknown>
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, lastFetchEpochMS }) {
const { access_token } = auth;
const companyId = auth.props?.['companyId'] as string;
const apiUrl = quickbooksCommon.getApiUrl(companyId!);
const query =
lastFetchEpochMS === 0
? `SELECT * FROM Invoice ORDERBY Metadata.CreateTime DESC MAXRESULTS 10`
: `SELECT * FROM Invoice WHERE Metadata.CreateTime >= '${dayjs(
lastFetchEpochMS
).toISOString()}' ORDERBY Metadata.CreateTime DESC`;
const response = await httpClient.sendRequest<
QuickbooksEntityResponse<QuickbooksInvoice>
>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
const invoices = response.body.QueryResponse?.['Invoice'] ?? [];
return invoices.map((invoice) => ({
epochMilliSeconds: dayjs(invoice.MetaData?.CreateTime).valueOf(),
data: invoice,
}));
},
};
export const newInvoice = createTrigger({
auth: quickbooksAuth,
name: 'new_invoice',
displayName: 'New Invoice',
description: 'Triggers when an invoice is created .',
props: {},
type: TriggerStrategy.POLLING,
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
sampleData: undefined,
});

View File

@@ -0,0 +1,87 @@
import {
TriggerStrategy,
createTrigger,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import { quickbooksAuth } from '../index';
import dayjs from 'dayjs';
import {
DedupeStrategy,
httpClient,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { quickbooksCommon, QuickbooksEntityResponse } from '../lib/common';
import { QuickbooksInvoice } from '../lib/types';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof quickbooksAuth>,
Record<string, unknown>
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, lastFetchEpochMS }) {
const { access_token } = auth;
const companyId = auth.props?.['companyId'] as string;
const apiUrl = quickbooksCommon.getApiUrl(companyId!);
const query =
lastFetchEpochMS === 0
? `SELECT * FROM Transfer ORDERBY Metadata.CreateTime DESC MAXRESULTS 10`
: `SELECT * FROM Transfer WHERE Metadata.CreateTime >= '${dayjs(
lastFetchEpochMS
).toISOString()}' ORDERBY Metadata.CreateTime DESC`;
const response = await httpClient.sendRequest<
QuickbooksEntityResponse<QuickbooksInvoice>
>({
method: HttpMethod.GET,
url: `${apiUrl}/query`,
queryParams: { query: query, minorversion: '70' },
headers: {
Authorization: `Bearer ${access_token}`,
Accept: 'application/json',
},
});
const transers = response.body.QueryResponse?.['Transfer'] ?? [];
return transers.map((transfer) => ({
epochMilliSeconds: dayjs(transfer.MetaData?.CreateTime).valueOf(),
data: transfer,
}));
},
};
export const newTransfer = createTrigger({
auth: quickbooksAuth,
name: 'new_transfer',
displayName: 'New Transfer',
description:
'Triggers when a Transfer is created.',
props: {},
type: TriggerStrategy.POLLING,
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
sampleData: undefined,
});

View File

@@ -0,0 +1,19 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}