forked from rwestlund/quickbooks-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
account.go
167 lines (138 loc) · 4.72 KB
/
account.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package quickbooks
import (
"encoding/json"
"errors"
"strconv"
)
const (
BankAccountType = "Bank"
OtherCurrentAssetAccountType = "Other Current Asset"
FixedAssetAccountType = "Fixed Asset"
OtherAssetAccountType = "Other Asset"
AccountsReceivableAccountType = "Accounts Receivable"
EquityAccountType = "Equity"
ExpenseAccountType = "Expense"
OtherExpenseAccountType = "Other Expense"
CostOfGoodsSoldAccountType = "Cost of Goods Sold"
AccountsPayableAccountType = "Accounts Payable"
CreditCardAccountType = "Credit Card"
LongTermLiabilityAccountType = "Long Term Liability"
OtherCurrentLiabilityAccountType = "Other Current Liability"
IncomeAccountType = "Income"
OtherIncomeAccountType = "Other Income"
)
type Account struct {
Id string `json:"Id,omitempty"`
Name string `json:",omitempty"`
SyncToken string `json:",omitempty"`
AcctNum string `json:",omitempty"`
CurrencyRef ReferenceType `json:",omitempty"`
ParentRef ReferenceType `json:",omitempty"`
Description string `json:",omitempty"`
Active bool `json:",omitempty"`
MetaData MetaData `json:",omitempty"`
SubAccount bool `json:",omitempty"`
Classification string `json:",omitempty"`
FullyQualifiedName string `json:",omitempty"`
TxnLocationType string `json:",omitempty"`
AccountType string `json:",omitempty"`
CurrentBalanceWithSubAccounts json.Number `json:",omitempty"`
AccountAlias string `json:",omitempty"`
TaxCodeRef ReferenceType `json:",omitempty"`
AccountSubType string `json:",omitempty"`
CurrentBalance json.Number `json:",omitempty"`
}
// CreateAccount creates the given account within QuickBooks
func (c *Client) CreateAccount(account *Account) (*Account, error) {
var resp struct {
Account Account
Time Date
}
if err := c.post("account", account, &resp, nil); err != nil {
return nil, err
}
return &resp.Account, nil
}
// FindAccounts gets the full list of Accounts in the QuickBooks account.
func (c *Client) FindAccounts() ([]Account, error) {
var resp struct {
QueryResponse struct {
Accounts []Account `json:"Account"`
MaxResults int
StartPosition int
TotalCount int
}
}
if err := c.query("SELECT COUNT(*) FROM Account", &resp); err != nil {
return nil, err
}
if resp.QueryResponse.TotalCount == 0 {
return nil, errors.New("no accounts could be found")
}
accounts := make([]Account, 0, resp.QueryResponse.TotalCount)
for i := 0; i < resp.QueryResponse.TotalCount; i += queryPageSize {
query := "SELECT * FROM Account ORDERBY Id STARTPOSITION " + strconv.Itoa(i+1) + " MAXRESULTS " + strconv.Itoa(queryPageSize)
if err := c.query(query, &resp); err != nil {
return nil, err
}
if resp.QueryResponse.Accounts == nil {
return nil, errors.New("no accounts could be found")
}
accounts = append(accounts, resp.QueryResponse.Accounts...)
}
return accounts, nil
}
// FindAccountById returns an account with a given Id.
func (c *Client) FindAccountById(id string) (*Account, error) {
var resp struct {
Account Account
Time Date
}
if err := c.get("account/"+id, &resp, nil); err != nil {
return nil, err
}
return &resp.Account, nil
}
// QueryAccounts accepts an SQL query and returns all accounts found using it
func (c *Client) QueryAccounts(query string) ([]Account, error) {
var resp struct {
QueryResponse struct {
Accounts []Account `json:"Account"`
StartPosition int
MaxResults int
}
}
if err := c.query(query, &resp); err != nil {
return nil, err
}
if resp.QueryResponse.Accounts == nil {
return nil, errors.New("could not find any accounts")
}
return resp.QueryResponse.Accounts, nil
}
// UpdateAccount updates the account
func (c *Client) UpdateAccount(account *Account) (*Account, error) {
if account.Id == "" {
return nil, errors.New("missing account id")
}
existingAccount, err := c.FindAccountById(account.Id)
if err != nil {
return nil, err
}
account.SyncToken = existingAccount.SyncToken
payload := struct {
*Account
Sparse bool `json:"sparse"`
}{
Account: account,
Sparse: true,
}
var accountData struct {
Account Account
Time Date
}
if err = c.post("account", payload, &accountData, nil); err != nil {
return nil, err
}
return &accountData.Account, err
}