Skip to content

Commit e5b1007

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
feat(quickbooks): add sales and receivables mutations
1 parent 1d5413c commit e5b1007

16 files changed

Lines changed: 2508 additions & 0 deletions
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import { ErrorExtractorId } from '@/tools/error-extractors'
2+
import { QUICKBOOKS_MAX_RESPONSE_BYTES } from '@/tools/quickbooks/client'
3+
import {
4+
addQuickBooksRequestId,
5+
buildQuickBooksCreateSalesDocumentBody,
6+
} from '@/tools/quickbooks/sales_utils'
7+
import type {
8+
QuickBooksCreateCreditMemoParams,
9+
QuickBooksMutationResponse,
10+
QuickBooksSalesTransaction,
11+
} from '@/tools/quickbooks/types'
12+
import {
13+
QUICKBOOKS_MUTATION_OUTPUTS,
14+
QUICKBOOKS_SALES_TRANSACTION_PROPERTIES,
15+
} from '@/tools/quickbooks/types'
16+
import {
17+
buildQuickBooksEntityUrl,
18+
getQuickBooksToolHeaders,
19+
transformQuickBooksMutationResponse,
20+
} from '@/tools/quickbooks/utils'
21+
import type { ToolConfig } from '@/tools/types'
22+
23+
export const quickbooksCreateCreditMemoTool: ToolConfig<
24+
QuickBooksCreateCreditMemoParams,
25+
QuickBooksMutationResponse<QuickBooksSalesTransaction>
26+
> = {
27+
id: 'quickbooks_create_credit_memo',
28+
name: 'QuickBooks Create Credit Memo',
29+
description: 'Create a customer credit memo with bounded sales lines',
30+
version: '1.0.0',
31+
params: {
32+
accessToken: {
33+
type: 'string',
34+
required: true,
35+
visibility: 'hidden',
36+
description: 'QuickBooks OAuth access token',
37+
},
38+
realmId: {
39+
type: 'string',
40+
required: true,
41+
visibility: 'hidden',
42+
description: 'QuickBooks company ID derived from the connected credential',
43+
},
44+
customerId: {
45+
type: 'string',
46+
required: true,
47+
visibility: 'user-or-llm',
48+
description: 'Customer receiving the credit memo',
49+
},
50+
lines: {
51+
type: 'json',
52+
required: true,
53+
visibility: 'user-or-llm',
54+
description: 'Bounded item and description lines',
55+
},
56+
transactionDate: {
57+
type: 'string',
58+
required: false,
59+
visibility: 'user-or-llm',
60+
description: 'Credit memo date in YYYY-MM-DD format',
61+
},
62+
documentNumber: {
63+
type: 'string',
64+
required: false,
65+
visibility: 'user-or-llm',
66+
description: 'Optional credit memo number',
67+
},
68+
privateNote: {
69+
type: 'string',
70+
required: false,
71+
visibility: 'user-or-llm',
72+
description: 'Internal credit memo note',
73+
},
74+
customerMemo: {
75+
type: 'string',
76+
required: false,
77+
visibility: 'user-or-llm',
78+
description: 'Customer-facing credit memo memo',
79+
},
80+
requestId: {
81+
type: 'string',
82+
required: false,
83+
visibility: 'user-or-llm',
84+
description: 'Optional Intuit idempotency request ID, up to 50 characters',
85+
},
86+
},
87+
oauth: {
88+
required: true,
89+
provider: 'quickbooks',
90+
requiredScopes: ['com.intuit.quickbooks.accounting'],
91+
},
92+
errorExtractor: ErrorExtractorId.QUICKBOOKS_FAULT,
93+
request: {
94+
url: (params) =>
95+
addQuickBooksRequestId(
96+
buildQuickBooksEntityUrl(params.realmId, 'creditmemo'),
97+
params.requestId
98+
).toString(),
99+
method: 'POST',
100+
headers: (params) => getQuickBooksToolHeaders(params.accessToken, 'application/json'),
101+
body: (params) => buildQuickBooksCreateSalesDocumentBody(params),
102+
retry: { enabled: false },
103+
maxResponseBytes: QUICKBOOKS_MAX_RESPONSE_BYTES,
104+
},
105+
transformResponse: (response) =>
106+
transformQuickBooksMutationResponse<QuickBooksSalesTransaction>(response, 'CreditMemo'),
107+
outputs: {
108+
record: {
109+
type: 'json',
110+
description: 'Created native QuickBooks CreditMemo',
111+
properties: QUICKBOOKS_SALES_TRANSACTION_PROPERTIES,
112+
},
113+
...QUICKBOOKS_MUTATION_OUTPUTS,
114+
},
115+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { ErrorExtractorId } from '@/tools/error-extractors'
2+
import { QUICKBOOKS_MAX_RESPONSE_BYTES } from '@/tools/quickbooks/client'
3+
import {
4+
addQuickBooksRequestId,
5+
buildQuickBooksCreatePaymentBody,
6+
} from '@/tools/quickbooks/sales_utils'
7+
import type {
8+
QuickBooksCreateCustomerPaymentParams,
9+
QuickBooksMutationResponse,
10+
QuickBooksSalesTransaction,
11+
} from '@/tools/quickbooks/types'
12+
import {
13+
QUICKBOOKS_MUTATION_OUTPUTS,
14+
QUICKBOOKS_SALES_TRANSACTION_PROPERTIES,
15+
} from '@/tools/quickbooks/types'
16+
import {
17+
buildQuickBooksEntityUrl,
18+
getQuickBooksToolHeaders,
19+
transformQuickBooksMutationResponse,
20+
} from '@/tools/quickbooks/utils'
21+
import type { ToolConfig } from '@/tools/types'
22+
23+
export const quickbooksCreateCustomerPaymentTool: ToolConfig<
24+
QuickBooksCreateCustomerPaymentParams,
25+
QuickBooksMutationResponse<QuickBooksSalesTransaction>
26+
> = {
27+
id: 'quickbooks_create_customer_payment',
28+
name: 'QuickBooks Create Customer Payment',
29+
description: 'Record a customer payment with optional bounded invoice allocations',
30+
version: '1.0.0',
31+
params: {
32+
accessToken: {
33+
type: 'string',
34+
required: true,
35+
visibility: 'hidden',
36+
description: 'QuickBooks OAuth access token',
37+
},
38+
realmId: {
39+
type: 'string',
40+
required: true,
41+
visibility: 'hidden',
42+
description: 'QuickBooks company ID derived from the connected credential',
43+
},
44+
customerId: {
45+
type: 'string',
46+
required: true,
47+
visibility: 'user-or-llm',
48+
description: 'Customer making the payment',
49+
},
50+
totalAmount: {
51+
type: 'number',
52+
required: true,
53+
visibility: 'user-or-llm',
54+
description: 'Positive total payment amount',
55+
},
56+
transactionDate: {
57+
type: 'string',
58+
required: false,
59+
visibility: 'user-or-llm',
60+
description: 'Payment date in YYYY-MM-DD format',
61+
},
62+
privateNote: {
63+
type: 'string',
64+
required: false,
65+
visibility: 'user-or-llm',
66+
description: 'Internal payment note',
67+
},
68+
paymentReferenceNumber: {
69+
type: 'string',
70+
required: false,
71+
visibility: 'user-or-llm',
72+
description: 'Payment reference number such as a check number',
73+
},
74+
paymentMethodId: {
75+
type: 'string',
76+
required: false,
77+
visibility: 'user-or-llm',
78+
description: 'QuickBooks payment method ID',
79+
},
80+
depositAccountId: {
81+
type: 'string',
82+
required: false,
83+
visibility: 'user-or-llm',
84+
description: 'QuickBooks deposit account ID',
85+
},
86+
invoiceAllocations: {
87+
type: 'json',
88+
required: false,
89+
visibility: 'user-or-llm',
90+
description: 'Up to 100 invoice allocations with invoiceId and positive amount',
91+
},
92+
requestId: {
93+
type: 'string',
94+
required: false,
95+
visibility: 'user-or-llm',
96+
description: 'Optional Intuit idempotency request ID, up to 50 characters',
97+
},
98+
},
99+
oauth: {
100+
required: true,
101+
provider: 'quickbooks',
102+
requiredScopes: ['com.intuit.quickbooks.accounting'],
103+
},
104+
errorExtractor: ErrorExtractorId.QUICKBOOKS_FAULT,
105+
request: {
106+
url: (params) =>
107+
addQuickBooksRequestId(
108+
buildQuickBooksEntityUrl(params.realmId, 'payment'),
109+
params.requestId
110+
).toString(),
111+
method: 'POST',
112+
headers: (params) => getQuickBooksToolHeaders(params.accessToken, 'application/json'),
113+
body: (params) => buildQuickBooksCreatePaymentBody(params),
114+
retry: { enabled: false },
115+
maxResponseBytes: QUICKBOOKS_MAX_RESPONSE_BYTES,
116+
},
117+
transformResponse: (response) =>
118+
transformQuickBooksMutationResponse<QuickBooksSalesTransaction>(response, 'Payment'),
119+
outputs: {
120+
record: {
121+
type: 'json',
122+
description: 'Created native QuickBooks Payment',
123+
properties: QUICKBOOKS_SALES_TRANSACTION_PROPERTIES,
124+
},
125+
...QUICKBOOKS_MUTATION_OUTPUTS,
126+
},
127+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { ErrorExtractorId } from '@/tools/error-extractors'
2+
import { QUICKBOOKS_MAX_RESPONSE_BYTES } from '@/tools/quickbooks/client'
3+
import {
4+
addQuickBooksRequestId,
5+
buildQuickBooksCreateSalesDocumentBody,
6+
} from '@/tools/quickbooks/sales_utils'
7+
import type {
8+
QuickBooksCreateEstimateParams,
9+
QuickBooksMutationResponse,
10+
QuickBooksSalesTransaction,
11+
} from '@/tools/quickbooks/types'
12+
import {
13+
QUICKBOOKS_MUTATION_OUTPUTS,
14+
QUICKBOOKS_SALES_TRANSACTION_PROPERTIES,
15+
} from '@/tools/quickbooks/types'
16+
import {
17+
buildQuickBooksEntityUrl,
18+
getQuickBooksToolHeaders,
19+
transformQuickBooksMutationResponse,
20+
} from '@/tools/quickbooks/utils'
21+
import type { ToolConfig } from '@/tools/types'
22+
23+
export const quickbooksCreateEstimateTool: ToolConfig<
24+
QuickBooksCreateEstimateParams,
25+
QuickBooksMutationResponse<QuickBooksSalesTransaction>
26+
> = {
27+
id: 'quickbooks_create_estimate',
28+
name: 'QuickBooks Create Estimate',
29+
description: 'Create an estimate with bounded item and description lines',
30+
version: '1.0.0',
31+
params: {
32+
accessToken: {
33+
type: 'string',
34+
required: true,
35+
visibility: 'hidden',
36+
description: 'QuickBooks OAuth access token',
37+
},
38+
realmId: {
39+
type: 'string',
40+
required: true,
41+
visibility: 'hidden',
42+
description: 'QuickBooks company ID derived from the connected credential',
43+
},
44+
customerId: {
45+
type: 'string',
46+
required: true,
47+
visibility: 'user-or-llm',
48+
description: 'Customer receiving the estimate',
49+
},
50+
lines: {
51+
type: 'json',
52+
required: true,
53+
visibility: 'user-or-llm',
54+
description: 'Bounded item and description lines',
55+
},
56+
transactionDate: {
57+
type: 'string',
58+
required: false,
59+
visibility: 'user-or-llm',
60+
description: 'Estimate date in YYYY-MM-DD format',
61+
},
62+
expirationDate: {
63+
type: 'string',
64+
required: false,
65+
visibility: 'user-or-llm',
66+
description: 'Estimate expiration date in YYYY-MM-DD format',
67+
},
68+
documentNumber: {
69+
type: 'string',
70+
required: false,
71+
visibility: 'user-or-llm',
72+
description: 'Optional estimate number',
73+
},
74+
privateNote: {
75+
type: 'string',
76+
required: false,
77+
visibility: 'user-or-llm',
78+
description: 'Internal estimate note',
79+
},
80+
customerMemo: {
81+
type: 'string',
82+
required: false,
83+
visibility: 'user-or-llm',
84+
description: 'Customer-facing estimate memo',
85+
},
86+
requestId: {
87+
type: 'string',
88+
required: false,
89+
visibility: 'user-or-llm',
90+
description: 'Optional Intuit idempotency request ID, up to 50 characters',
91+
},
92+
},
93+
oauth: {
94+
required: true,
95+
provider: 'quickbooks',
96+
requiredScopes: ['com.intuit.quickbooks.accounting'],
97+
},
98+
errorExtractor: ErrorExtractorId.QUICKBOOKS_FAULT,
99+
request: {
100+
url: (params) =>
101+
addQuickBooksRequestId(
102+
buildQuickBooksEntityUrl(params.realmId, 'estimate'),
103+
params.requestId
104+
).toString(),
105+
method: 'POST',
106+
headers: (params) => getQuickBooksToolHeaders(params.accessToken, 'application/json'),
107+
body: (params) => buildQuickBooksCreateSalesDocumentBody(params),
108+
retry: { enabled: false },
109+
maxResponseBytes: QUICKBOOKS_MAX_RESPONSE_BYTES,
110+
},
111+
transformResponse: (response) =>
112+
transformQuickBooksMutationResponse<QuickBooksSalesTransaction>(response, 'Estimate'),
113+
outputs: {
114+
record: {
115+
type: 'json',
116+
description: 'Created native QuickBooks Estimate',
117+
properties: QUICKBOOKS_SALES_TRANSACTION_PROPERTIES,
118+
},
119+
...QUICKBOOKS_MUTATION_OUTPUTS,
120+
},
121+
}

0 commit comments

Comments
 (0)